为什么“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实际上没有布尔值( 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 */;
如果(表达式)可以转换为bool,则表达式将评估为true。 “hello”是一个字符串文字,它计算为一个指针,因为它不同于0,它将导致为true。 空指针将返回false。
如果表达式可以隐式转换为bool,则该语句有效,大多数表达式都会出现这种情况:所有标量类型(字符,算术类型,指针,枚举等)以及结构/类变量(如果它们有一个运算符返回标量类型) 。 根本不返回任何值的函数(void)将产生错误。
如果声明只处理真假。 所以,如果它不是假的,那么其他一切都是真的。
False可以是0,FALSE(bool),NULL。 所有表达式都被评估为true或false之一。
在您的情况下,它的计算结果为true,因为它不是虚假表达式之一。
C没有布尔数据类型。 因此,需要真值的语句接受等于0
的值表示false
而任何其他值表示true
。 NULL
也计算为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
主体。