수색…


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 > 1if 블록 내부의 명령문을 실행하기 위해 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++;
}

ab모두 1 보다 큰 경우에만 printfa++ 실행합니다.

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow