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

Anu*_*ngh 0 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();
} 
Run Code Online (Sandbox Code Playgroud)

在这里输出是Inside if ....我想知道如何在if语句中对这个东西进行求值,并且对if语句中传递的内容有任何限制.

and*_*net 7

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

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

  • 有一个限制:`if`条件中的值必须是标量类型.因此,例如,您不能使用结构. (3认同)

pmg*_*pmg 5

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");}
Run Code Online (Sandbox Code Playgroud)

文字字符串被解释为指针......它指向真实字符,所以这是真的

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 {}
Run Code Online (Sandbox Code Playgroud)

有趣的是一个空字符串或字符串"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 {}
Run Code Online (Sandbox Code Playgroud)

NUL字符(不是作为指针的NULL)的int值为0且为false

if ('\0') {} else {printf("'\\0' is false\n");}
Run Code Online (Sandbox Code Playgroud)

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

  • 值得注意的是,"0"和"0"不是零值,因此它们评估为真(因为有些人可能误解"任何'0'"包括字符串). (2认同)