son*_*ony 3 c c++ syntax for-loop
for (i = 0; *(str+i); i++)
{
//some code;
}
Run Code Online (Sandbox Code Playgroud)
这个语法中的第二个条件是什么意思?我们可以这样写吗?
此类循环通常用于具有可转换为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中有效.