[英]Why does “hello” evaluate as true in a boolean condition?
我一直在用C语言进行工作,因为这是我刚开始使用的第一语言。这次我使用if else语句进行一些编码...我发现了一些我不明白为什么会发生的东西。跟随
#include<stdio.h>
#include<conio.h>
void main()
{
printf("How If - Else works\n");
if("hello")
{
printf("Inside if\n");
}
else
{
printf("Inside else\n");
}
getch();
}
在此输出是Inside if....。我想知道在if语句中如何评估该值,并且对在if语句中传递的内容没有任何限制。
如果可以将(表达式)转换为bool,则该表达式的值为true。 “ hello”是一个字符串文字,其结果为一个指针,并且由于它不同于0,因此将返回true。 空指针将返回false。
如果表达式可以隐式转换为bool,则该语句有效,并且大多数表达式都会发生这种情况:所有标量类型(字符,算术类型,指针,枚举等)以及结构/类变量(如果它们具有返回标量类型的运算符) 。 根本不返回任何值的函数(无效)将产生错误。
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 */;
if语句仅处理true和false。 因此,如果不是假的,那么其他一切都是真实的。
False可以是0,FALSE(布尔),NULL。 所有表达式都被评估为true或false之一。
在您的情况下,它的计算结果为true,因为它不是假表达式之一。
C没有布尔数据类型。 这样,要求真值的语句接受等于0
的值表示false
而其他任何值表示true
。 NULL
计算结果也为false
(这是一个定义为0的宏)。
在您的代码中, "hello"
是指向字符串的非空(不同于0)的指针。 这样, if
语句内部始终是true
。
具有值的任何内容都可以用作此类语句的表达式。
字符串等于值True。 因此,您的程序流进入if
主体,而不是else
主体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.