为什么“hello”在布尔条件下评估为true?

我一直在用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实际上没有布尔值( truefalse )(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");} 

当你有一个真正的布尔结构时会发生什么,编译器会发出代码将其转换为01

 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 */; 

如果(表达式)可以转换为bool,则表达式将评估为true。 “hello”是一个字符串文字,它计算为一个指针,因为它不同于0,它将导致为true。 空指针将返回false。

如果表达式可以隐式转换为bool,则该语句有效,大多数表达式都会出现这种情况:所有标量类型(字符,算术类型,指针,枚举等)以及结构/类变量(如果它们有一个运算符返回标量类型) 。 根本不返回任何值的函数(void)将产生错误。

如果声明只处理真假。 所以,如果它不是假的,那么其他一切都是真的。

False可以是0,FALSE(bool),NULL。 所有表达式都被评估为true或false之一。

在您的情况下,它的计算结果为true,因为它不是虚假表达式之一。

C没有布尔数据类型。 因此,需要真值的语句接受等于0的值表示false而任何其他值表示trueNULL也计算为false (它是一个定义为0的宏)。

在您的代码中, "hello"是指向字符串的非null(不同于0)指针。 这样, if语句内部总是true

任何具有值的东西都可以用作这种语句的表达式。

C中的“字符串文字”表示字符序列。 这将计算为零或NULL以外的NULL ; 所以控制流入if循环。

任何独立的表达式都可以在if条件括号内使用semntics进行评估,如C标准中所述 :

逗号运算符的左操作数被计算为void表达式; 评估后有一个序列点。 然后评估右操作数; 结果有它的类型和价值

因此,如果您执行以下操作,程序流程将进入else部分:

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

因为表达式的结果采用最后一个操作数( 0 )的值。

字符串等于值True。 因此,您的程序流进入if主体而不是else主体。