Почему это вывод кода?

#c

#c

Вопрос:

Итак, это вопрос, основанный на выводе:

Код является:

 #include <stdio.h>
int main()
{
   char ch;
   if ((ch=printf( "")))
      printf("It mattersn");
   else
      printf("It doesnt mattern");
   return 0;
}
  

Почему вывод — Это не имеет значения? Что именно тестируется в операторе if?

Во-вторых, в операторах switch case, если я это сделаю, что-то вроде,

 char a[] = "abc";
  

и тогда я делаю,

 switch(i)
{  
   case abc:
   ........
}
  

Почему это неправильно? Не можем ли мы использовать строковые константы в операторах case?

Комментарии:

1. недостаточно ясно: что такое i? Кстати, вы должны использовать «abc» вместо abc в инструкции case

2. @vivoconunxino: вы должны использовать «abc» вместо abc в инструкции case , чтобы решить, что именно?

3. Итак, у нас могут быть строковые константы в операторах case, верно?

4. char a = "abc" это 3 символа, а не 1

5. @Tim Castelijns: "abc" это строковый литерал, который «содержит» массив из четырех символов: 'a' , 'b' 'c' и нулевой символ .

Ответ №1:

printf() возвращает количество записанных символов. При вызове с пустой строкой формата ( "" ), это значение, конечно, будет равно 0, что будет считаться «false» if , и, таким образом, else будет принята ветвь.

И нет, вы, конечно, не можете switch() использовать строки в C.

Комментарии:

1. Итак, мы можем иметь только целочисленные константы в случае операторов switch case?

2. И в самом операторе switch, т. Е. switch(i) , Здесь, i может быть только целым числом или чем-то еще?

3. Это должно быть целочисленное выражение.

4. @GrzegorzSzpetkowski Это не соответствует тому, что говорится в проекте C99, и я не думаю, что это так уж далеко от истины. Там просто написано «целочисленное выражение». Вы можете сделать, например, switch (x 3) для int x .

Ответ №2:

printf возвращает количество напечатанных символов, в вашем случае 0 символов.

Итак, вы устанавливаете ch в 0.

Присваивание принимает присвоенное значение, в данном случае 0.

0 равно false, следовательно, оператор if переходит в блок else.

Ответ №3:

printf возвращает длину строки, которую он выводит на экран, поэтому printf( "") ничего не выводит, так что length=0 так if(0) не выполняется, поэтому переходит к else части.

char a является символом, а не строкой, поэтому char a[]="abc" OR char *a="abc" допустимо и, наконец, только char и int разрешено в switch-cases не strings

Ответ №4:

  • Посмотрите документацию по функции printf

    int printf ( формат const char *, … );

… При успешном завершении возвращается общее количество записанных символов. Если возникает ошибка записи, устанавливается индикатор ошибки (ferror) и возвращается отрицательное число…