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;
}