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。