我一直在用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语句中传递的内容有任何限制。
答案 0 :(得分:7)
(表达式)如果可以转换为bool,则会计算为true。 “hello”是一个字符串文字,它计算为一个指针,因为它不同于0,它将导致为true。空指针将返回false。
如果表达式可以隐式转换为bool,则该语句有效,大多数表达式都会出现这种情况:所有标量类型(字符,算术类型,指针,枚举等)以及结构/类变量(如果它们有一个运算符返回)标量类型。完全没有返回值的函数(void)会产生错误。
答案 1 :(得分:5)
C并不具有布尔值(true
或false
)值(C99可以,但我的注释仍然适用)。
C解释为false
是什么&#34; 0&#34 ;;其他一切都是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 */;
答案 2 :(得分:0)
如果声明只处理真假。所以,如果它不是假的,那么其他一切都是真的。
False可以是0,FALSE(bool),NULL。所有表达式都被评估为true或false。
在您的情况下,它的计算结果为true,因为它不是虚假表达式之一。
答案 3 :(得分:0)
C没有布尔数据类型。因此,需要真值的语句接受等于0
的值代表false
,而任何其他值代表true
。 NULL
也评估为false
(它是一个定义为0的宏)。
在您的代码中"hello"
是一个非空(不同于0)指向字符串的指针。这样,true
语句中的if
始终为{{1}}。
任何具有值的东西都可以用作这种陈述的表达式。
答案 4 :(得分:0)
C中的“字符串文字”表示字符序列。这将评估为零或NULL
以外的值;所以控制流入if循环。
任何独立的表达式都可以在带有semntics的if条件括号内进行评估,如C standard中所述:
逗号运算符的左操作数被计算为void表达式;评估后有一个序列点。然后评估右操作数;结果有其类型和值
因此,如果您执行以下操作,程序流程将进入else
部分:
if(1,1,1,0) {
printf("Inside if\n");
}
因为表达式的结果采用了最后一个操作数(0
)的值。
答案 5 :(得分:-2)
字符串等于值True。因此,您的计划流程会进入if
正文,而不是else
正文。