C Language
선택 진술
수색…
if () 문
프로그램 흐름을 제어하는 가장 간단한 방법 중 하나는 선택 문을 사용 if 것입니다. 이 명령문을 사용하여 코드 블록을 실행할지 여부를 결정할 수 있습니다.
C의 if 선택 문에 대한 구문은 다음과 같습니다.
if(cond)
{
statement(s); /*to be executed, on condition being true*/
}
예를 들어,
if (a > 1) {
puts("a is larger than 1");
}
여기서 a > 1 은 if 블록 내부의 명령문을 실행하기 위해 true 로 평가되어야하는 조건 입니다. 이 예제에서 "a가 1보다 큽니다"는 a > 1 경우에만 인쇄됩니다.
if 선택 문은 포장 중괄호를 생략 할 수 있습니다 { 및 } 블록 내에서 하나의 문이있는 경우. 위의 예는 다음과 같이 다시 쓸 수 있습니다.
if (a > 1)
puts("a is larger than 1");
그러나 블록 내에서 여러 명령문을 실행하려면 중괄호를 사용해야합니다.
if 대한 조건 은 여러 표현식을 포함 할 수 있습니다. if 는 표현식의 최종 결과가 참인 경우에만 조치를 수행합니다.
예를 들어
if ((a > 1) && (b > 1)) {
puts("a is larger than 1");
a++;
}
a 와 b 가 모두 1 보다 큰 경우에만 printf 와 a++ 실행합니다.
if () ... else 문과 구문
하지만 if 그 상태가 평가에만 작업을 수행 true , if / else 당신이 다른 동작 조건을 지정할 수 있습니다 true 과 조건이 false .
예:
if (a > 1)
puts("a is larger than 1");
else
puts("a is not larger than 1");
if 문과 마찬가지로 if 또는 else 내의 블록이 하나의 명령문으로만 구성되어 if 중괄호를 생략 할 수 있습니다 (그러나 그렇게하면 쉽게 실수로 문제가 쉽게 발생할 수 있으므로 권장하지 않습니다). 그러나 if 또는 else 블록 내에 둘 이상의 명령문이있는 if 블록에서 중괄호를 사용해야합니다.
if (a > 1)
{
puts("a is larger than 1");
a--;
}
else
{
puts("a is not larger than 1");
a++;
}
switch () 문
switch 문은 특정 테스트 변수의 값에 따라 프로그램이 여러 가지 일을 수행하기를 원할 때 유용합니다.
switch 문을 사용하는 예는 다음과 같습니다.
int a = 1;
switch (a) {
case 1:
puts("a is 1");
break;
case 2:
puts("a is 2");
break;
default:
puts("a is neither 1 nor 2");
break;
}
이 예제는
int a = 1;
if (a == 1) {
puts("a is 1");
} else if (a == 2) {
puts("a is 2");
} else {
puts("a is neither 1 nor 2");
}
switch 문을 사용할 때 a 값이 1이면 a is 1 이 인쇄됩니다. 의 값이있는 경우 a 다음 2이고, a is 2 인쇄한다. 그렇지 않으면 a is neither 1 nor 2 가 인쇄 a is neither 1 nor 2 .
case n: switch 문에 전달 된 값이 n 일 때 실행 흐름이 점프 할 위치를 설명하는 데 사용됩니다. n 은 컴파일 타임 상수 여야하며 동일한 n 은 한 switch 문에 한 번만 존재할 수 있습니다.
default: 값이 case n: 의 선택 항목 중 하나와 일치하지 않을 때를 설명하는 데 사용됩니다. 예기치 않은 동작을 잡으려면 모든 switch 문에 default 사례를 포함시키는 것이 좋습니다.
break; 명령문은 switch 블록 밖으로 점프 해야합니다.
참고 : 실수로 case 가 끝난 후 break 을 잊어 버린 case , 컴파일러는 "fall through" 하고 모든 후속 case 문 (있는 경우)이 실행될 것이라고 가정합니다 ( break 문이 후속 사례 명세서가 일치하는지 여부에 관계없이 이 속성은 Duff 's Device 를 구현하는 데 사용됩니다. 이 동작은 종종 C 언어 사양의 결함으로 간주됩니다.
다음은 break; 이없는 경우의 효과를 보여주는 예입니다 break; :
int a = 1;
switch (a) {
case 1:
case 2:
puts("a is 1 or 2");
case 3:
puts("a is 1, 2 or 3");
break;
default:
puts("a is neither 1, 2 nor 3");
break;
}
a 의 값이 1 또는 2 일 a is 1 or 2 , a is 1 or 2 이고 a is 1, 2 or 3 모두 인쇄됩니다. a 가 3이면 a is 1, 2 or 3 만 a is 1, 2 or 3 이 인쇄됩니다. 그렇지 않으면 a is neither 1, 2 nor 3 이 인쇄 a is neither 1, 2 nor 3 .
default 케이스는 필요하지 않습니다. 특히 switch 에서 가져온 값 세트가 완료되고 컴파일 타임에 알려지는 경우에 특히 그렇습니다.
가장 좋은 예는 enum switch 를 사용하는 것입니다.
enum msg_type { ACK, PING, ERROR };
void f(enum msg_type t)
{
switch (t) {
case ACK:
// do nothing
break;
case PING:
// do something
break;
case ERROR:
// do something else
break;
}
}
이 작업을 수행하는 데는 여러 가지 이점이 있습니다.
- 대부분의 컴파일러는 값을 처리하지 않으면 경고를보고합니다 (
default사례가있는 경우보고되지 않음) - 같은 이유로
enum새 값을 추가하면 새 값을 처리하는 것을 잊어 버린 모든 장소에 대한 알림이 표시됩니다 (default사례가 있으면 수동으로 해당 사례를 검색해야합니다) - 독자는 "
default:숨겨져있는 것default:"을 알아낼 필요가 없으며, 다른enum값이 있는지 또는 "enum"에 대한 보호인지 여부를 파악할 필요가 없습니다. 다른enum값이있는 경우 코더는 의도적default케이스를 사용 했습니까? 아니면 값을 추가 할 때 도입 된 버그가 있습니까? - 와일드 카드 뒤에 숨길 수 없으므로 각
enum값을 처리하면 코드가 자명 해 지므로 명시 적으로 처리해야합니다.
그럼에도 불구하고 누군가가 다음과 같은 악의적 인 코드를 작성하는 것을 막을 수는 없습니다.
enum msg_type t = (enum msg_type)666; // I'm evil
따라서 정말로 필요하다면 스위치를 찾기 전에 추가 검사를 추가 할 수 있습니다.
void f(enum msg_type t)
{
if (!is_msg_type_valid(t)) {
// Handle this unlikely error
}
switch(t) {
// Same code than before
}
}
if () ... else 사다리 두 개 이상의 if () ... else 문 연결
if ()... else 문을 사용하면 if () 내의 조건이 충족되지 않을 때 발생하는 하나의 (기본) 비헤이비어를 정의 할 수 있지만 두 개 이상의 if () ... else 문을 연쇄 적으로 정의하면 커플을 정의 할 수 if () ... else . "default"로 동작하는 마지막 else 브랜치로 이동하기 전에 더 많은 동작을 수행합니다.
예:
int a = ... /* initialise to some value. */
if (a >= 1)
{
printf("a is greater than or equals 1.\n");
}
else if (a == 0) //we already know that a is smaller than 1
{
printf("a equals 0.\n");
}
else /* a is smaller than 1 and not equals 0, hence: */
{
printf("a is negative.\n");
}
중첩 된 if () ... else VS if () .. else Ladder
중첩 된 if()...else 문은 내부 (내부) 조건문을 모두 검사하기 때문에 if()...else 문은 if()...else 래더와 비교하여 더 많은 실행 시간을 필요로 if()...else 조건부 if() 문이 충족되면 if()..else ladder는 if() 또는 else if() 조건문이 참이면 조건 테스트를 중지합니다.
if()...else 사다리 :
#include <stdio.h>
int main(int argc, char *argv[])
{
int a, b, c;
printf("\nEnter Three numbers = ");
scanf("%d%d%d", &a, &b, &c);
if ((a < b) && (a < c))
{
printf("\na = %d is the smallest.", a);
}
else if ((b < a) && (b < c))
{
printf("\nb = %d is the smallest.", b);
}
else if ((c < a) && (c < b))
{
printf("\nc = %d is the smallest.", c);
}
else
{
printf("\nImprove your coding logic");
}
return 0;
}
일반적인 경우 if()...else 상응하는 중첩 된 것보다 더 나은 것으로 간주됩니다.
#include <stdio.h>
int main(int argc, char *argv[])
{
int a, b, c;
printf("\nEnter Three numbers = ");
scanf("%d%d%d", &a, &b, &c);
if (a < b)
{
if (a < c)
{
printf("\na = %d is the smallest.", a);
}
else
{
printf("\nc = %d is the smallest.", c);
}
}
else
{
if(b < c)
{
printf("\nb = %d is the smallest.", b);
}
else
{
printf("\nc = %d is the smallest.", c);
}
}
return 0;
}