这个条件检查语句在for循环中是否合法?

son*_*ony 3 c c++ syntax for-loop

for (i = 0; *(str+i); i++)
{
    //some code;
}
Run Code Online (Sandbox Code Playgroud)

这个语法中的第二个条件是什么意思?我们可以这样写吗?

Vla*_*cow 5

此类循环通常用于具有可转换为bool值的标记值的数组.例如对于字符串.(字符串以零字符结尾)

例如,此循环计算字符串文字"Hello"的长度

const char *str = "Hello";

size_t i = 0;
for ( ; *( str + i );  i++ )
{
    /* empty body of the loop */
}

std::cout << "The length of string literal " << str 
          << " is equal to " << i << std::endl;
Run Code Online (Sandbox Code Playgroud)

或者在C中你可以使用 printf

printf( "The length of string literal %s is equal to %zu\n", str, i ); 
Run Code Online (Sandbox Code Playgroud)

表达*( str + i )相当于str[i]

在for循环中,这个表达式使用的条件相当于

*( str + i ) != 0
Run Code Online (Sandbox Code Playgroud)

那就是它只是转换为类型 bool

( bool ) *( str + i )
Run Code Online (Sandbox Code Playgroud)

因此,如果表达式等于0,那么false否则会产生true.

另一个例子.如果要输出程序参数,则可以按以下方式编写

#include <iostream>

int main( int argc, char *argv[] )
{
    while ( *argv ) std::cout << *argv++ << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

在C中

while ( *argv ) puts( *argv++ );
Run Code Online (Sandbox Code Playgroud)

因为带有程序参数argv []的数组的最后一个元素总是等于NULL.

程序中的while循环与以下for循环等效

for ( int i = 0; *( argv + i ); i++ )
Run Code Online (Sandbox Code Playgroud)

要么

for ( int i = 0; argv[i]; i++ )
Run Code Online (Sandbox Code Playgroud)

来自C++标准(5.2.1订阅)

1后缀表达式后跟方括号中的表达式是后缀表达式.其中一个表达式应具有"T的数组"类型或"指向T的指针",另一个表达式应具有未映射的枚举或整数类型.结果类型为"T".类型"T"应为完全定义的对象类型.65 表达式E1 [E2]与*((E1)+(E2)相同(按定义)

同样在C中有效.