Почему «привет» оценивается как истинное в логическом состоянии?

Я работаю на языке C, так как это был мой первый язык, с которого я начал. В этот раз я делал некоторую кодировку с выражением if else … и я нахожу то, что я не могу понять, почему это происходит. Код такой же, как и следовать

#include #include void main() { printf("How If - Else works\n"); if("hello") { printf("Inside if\n"); } else { printf("Inside else\n"); } getch(); } 

В этом вывод был Inside if …. Я хочу знать, как эта вещь получает оценку внутри оператора if и есть ли какое-либо ограничение на то, что мы передаем в инструкции if.

C действительно не имеет логических ( true или false ) значений (C99 делает, но мои примечания ниже все еще применяются).

Что C интерпретирует как false – это что-то «0»; все остальное true ;

так

 if (0) {} else {printf("0 is false\n");} if (NULL) {} else {printf("NULL is false\n");} if (0.0) {} else {printf("0.0 is false\n");} 

буквальная строка интерпретируется как указатель … и указывает на действительные символы, так что это правда

 if (1) {printf("1 is true\n");} else {} if (-1) {printf("-1 is true\n");} else {} if ("hello") {printf("\"hello\" is true\n");} else {} if (3.14159) {printf("3.14159 is true\n");} else {} 

Интересно, что пустая строка или строка "0" или символ '0' true

 if ("") {printf("\"\" is true\n");} else {} if ("0") {printf("\"0\" is true\n");} else {} if ('0') {printf("'0' is true\n");} else {} 

Символ NUL (не NULL, который является указателем) имеет значение int 0 и false

 if ('\0') {} else {printf("'\\0' is false\n");} 

Что происходит, когда у вас есть реальная логическая конструкция, заключается в том, что компилятор испускает код для преобразования этого значения в 0 или 1

 if (a > b) /* whatever */; // if a is greater than b, the compiler generated code will be something like if (1) /* whatever */; // otherwise, if a <= b, the generated code would look like if (0) /* whatever */; 

Значение (выражение) будет оцениваться как true, если оно может быть преобразовано в bool. «hello» – строковый литерал, который вычисляет указатель, и поскольку он отличается от 0, это приведет к истине. Нулевой указатель вернет false.

Оператор действителен, если выражение может быть неявно преобразовано в bool, и это происходит с большинством выражений: все скалярные типы (символы, арифметические типы, указатели, enums и т. Д.), А также переменные struct / class, если они имеют оператор, возвращающий скалярный тип , Функции, возвращающие значение вообще (void), генерируют ошибку.

Если оператор выполняет только true и false. Итак, если это не ложь, все остальное – это правда.

False может быть 0, FALSE (bool), NULL. Все выражения оцениваются по одному из true или false.

В вашем случае он оценивается как true, потому что это не одно из ложных выражений.

C не имеет логического типа данных. Таким образом, утверждения, требующие значений истинности, принимают, что значение, равное 0 представляет false а любое другое значение представляет true . NULL также оценивает значение false (это макрос, определяемый как 0).

В вашем коде "hello" есть ненулевой (отличный от 0) указатель на строку. Таким образом, это всегда будет true внутри операторов if .

Все, что имеет значение, может использоваться как выражение для такого рода операторов.

«Строковый литерал» в C представляет последовательность символов. Это оценивает значение, отличное от нуля или NULL ; поэтому управление переходит в if-loop.

Любое независимое выражение может быть оценено внутри условных скобок if с помощью семантики, как указано в стандарте C :

Левый операнд оператора запятой оценивается как выражение void; после его оценки появляется точка последовательности. Затем оценивается правый операнд; результат имеет свой тип и значение

Итак, stream программы переходит в else часть, если вы делаете что-то вроде:

 if(1,1,1,0) { printf("Inside if\n"); } 

так как результат выражения принимает значение последнего операнда ( 0 ).

Строки равны значению True. Следовательно, ваш stream программы переходит в тело if а не в тело else .