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

时间:2014-03-12 19:47:26

标签: c if-statement boolean

我一直在用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语句中传递的内容有任何限制。

6 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

C并不具有布尔值(truefalse)值(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");}

当你有一个真正的布尔结构时会发生什么,编译器会发出代码将其转换为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 */;

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

C没有布尔数据类型。因此,需要真值的语句接受等于0的值代表false,而任何其他值代表trueNULL也评估为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正文。