繁体   English   中英

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

[英]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并没有真正的布尔值( 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 */;

if语句仅处理true和false。 因此,如果不是假的,那么其他一切都是真实的。

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

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

C没有布尔数据类型。 这样,要求真值的语句接受等于0的值表示false而其他任何值表示true NULL计算结果也为false (这是一个定义为0的宏)。

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

具有值的任何内容都可以用作此类语句的表达式。

C中的“字符串文字”表示字符序列。 计算结果为非零或NULL 因此控制流入if循环。

任何独立的表达式都可以在条件条件圆括号内的条件下用C标记表示,如C标准中所述

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM