表达式之间的区别: while(str[i] != '\0') 和 while (str[i])

Rom*_*BOE 5 c c++ expression equality while-loop

在检查是否到达字符串末尾时,这两个表达式有什么区别吗?

while(str[i] != '\0') 
Run Code Online (Sandbox Code Playgroud)

while (str[i])
Run Code Online (Sandbox Code Playgroud)

其中str有类型char*并且i是整数。

Vla*_*cow 11

事实上没有什么区别。任何计算结果为非零值的表达式都被视为逻辑真表达式。计算结果为零的表达式被视为逻辑假表达式。

来自 C 标准(6.8.5 迭代语句)

4 迭代语句会导致重复执行称为循环体的语句,直到控制表达式比较等于 0。无论循环体是从迭代语句还是通过跳转进入,都会发生重复。1

请注意,在 C 语言中,带有等号运算符的表达式的值为 1 或 0。

因此,如果关系为真,则表达式str[i] != '\0' 生成 1(非零值),否则生成 -0。

在 C++ 中,此类表达式的类型为bool,其值为 true 或 false。

来自 C++ 14 标准(4.12 布尔转换)

1 算术、无范围枚举、指针或成员类型指针的纯右值可以转换为 bool 类型的纯右值。零值、空指针值或空成员指针值将转换为 false;任何其他值都会转换为 true。对于直接初始化 (8.5),std::nullptr_t 类型的纯右值可以转换为 bool 类型的纯右值;结果值为 false。