Нужна помощь в решении головоломки программирования на основе C - PullRequest
4 голосов
/ 24 августа 2011

Я сталкивался с этой загадкой здесь .Я не могу понять, почему НЕТ не напечатано.Есть идеи?

#include<stdio.h>
int main()
{
      int a=10;
      switch(a)
      {
              case '1':
                  printf("ONE\n");
                  break;
              case '2':
                  printf("TWO\n");
                  break;
              defa1ut:
                  printf("NONE\n");
      }
      return 0;
}

Ответы [ 5 ]

15 голосов
/ 24 августа 2011

defa1ut: является синтаксически допустимой меткой, например, для goto, но не для default оператора switch.

Если вы скомпилируете gcc с достаточным количеством предупреждений, это укажет на это:

ajw @ rapunzel: / tmp> gcc -Wall -Wextra test.c
test.c: в функции 'main': test.c: 13: 15: предупреждение: метка 'defa1ut'определен, но не используется

Это хороший аргумент для построения с высокими предупреждениями и стремления к 0 предупреждениям в каждой сборке.

3 голосов
/ 24 августа 2011

Если defa1ut является опечаткой для default и выводится строка «НЕТ»:

Это потому, что '1' и 1 отличаются.

'1' означает значение ASCII символа '1', значение которого в десятичном формате 49. и 1 является целым числом.

Первый случай будет истинным, если значение a равно 49 или '1', но как a=10, поэтому оно не равно '1' и не равно '2' и, следовательно, default выполняется (если он существовал, и defa1ut не является опечаткой).

Если defa1ut не является опечаткой для default и просто ничего не печатается:

В этом случае у вас нет default, который выглядит как defa1ut, который будет действовать как обычная этикетка, поэтому просто ничего не будет напечатано.

1 голос
/ 02 октября 2012

Поскольку defa1ut не является ключевым словом, к нему следует обращаться с помощью оператора case.

1 голос
/ 24 августа 2011

по умолчанию написано неправильно. и поэтому этот случай никогда не будет достигнут. http://codepad.org/gQPA6p4s

#include<stdio.h>
int main()
{
      int a=10;
      switch(a)
      {
              case '1':
                  printf("ONE\n");
                  break;
              case '2':
                  printf("TWO\n");
                  break;
              defalut:
                  printf("NONE\n");
              mickey_mouse:
                  printf("No Mickey\n");
              default :
                  printf("CORRECT DEFAULT\n");
      }
      return 0;
}
0 голосов
/ 24 августа 2011

Почему вы думаете, что это должно быть напечатано?

defa1ut отличается от default

...