这个条件检查语句在 for 循环中合法吗?
Is this condition checking statement legal in a for loop?
for (i = 0; *(str+i); i++)
{
//some code;
}
此语法中的第二个条件是什么意思?可以这么写吗?
*(str+i)
等同于 str[i]
,前提是 str
是指向某种数据类型的指针。这是一个有效的语法。
str
似乎是一个空终止字符串。当 *(str+i)
等于 '[=16=]'
.
时,此条件将 false
是的。 str
是一个指针,因此当到达字符串空终止符 ('[=13=]'
) 时,条件将为假,使循环停止执行其主体。
假设字符串将是这样的:
str: 'a'|'b'|'[=10=]'
i: 0 | 1 | 2
所以当i
得到值2时,那么这个*(str+i)
就会得到0,所以你那时候的循环就是这样:
for (i = 0; 0; i++)
因为指针运算将导致 *(str+i)
指向字符串的最后一个条目。
此类循环通常用于具有可以转换为布尔值的标记值的数组。例如对于字符串。 (字符串以零字符结束)
例如这个循环计算字符串文字的长度"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;
或者在 C 中你可以使用 printf
printf( "The length of string literal %s is equal to %zu\n", str, i );
表达式*( str + i )
等同于str[i]
在 for 循环中,此表达式使用 like 条件等同于
*( str + i ) != 0
也就是刚转成类型bool
( bool ) *( str + i )
所以如果表达式等于 0 则它产生 false
否则 true
.
再举个例子。如果要输出程序参数那么可以这样写
#include <iostream>
int main( int argc, char *argv[] )
{
while ( *argv ) std::cout << *argv++ << std::endl;
}
C 中的 Ot
while ( *argv ) puts( *argv++ );
因为程序参数argv[]数组的最后一个元素总是等于NULL。
程序中的while循环相当于下面的for循环
for ( int i = 0; *( argv + i ); i++ )
或
for ( int i = 0; argv[i]; i++ )
来自 C++ 标准(5.2.1 下标)
1 A postfix expression followed by an expression in square brackets is
a postfix expression. One of the expressions shall have the type
“array of T” or “pointer to T” and the other shall have unscoped
enumeration or integral type. The result is of type “T.” The type “T”
shall be a completely-defined object type.65 The expression E1[E2]
is identical (by definition) to *((E1)+(E2))
在C语言中也是如此
循环中的第二个语句检查条件是否为真。如果条件为真,循环继续;如果为假,则循环终止。此外,C 将 0
视为 false
,将任何非零值视为 true
。因此,如果 *(str+i)
非零,则计算结果为 true
,如果为零,则计算结果为 false
。由于 C 中的每个字符串都是一个以 [=16=]
结尾的字符数组(或零,其计算结果为 false
),查看字符串终止字符的计算结果为 false
,因此,该语句是合法有效。
关于为什么它在 C 中会这样发生的更多信息,这是在算术逻辑单元 (ALU) 的累加器中加载某些内容导致设置某些标志(例如 ACC 是否为零)的副作用.
为了清楚起见,for
循环结构
for (i = 0; *(str+i); i++)
可以重写为
for (i = 0; str[i]; i++) //pointer arithmetic
可以重写为
for (i = 0; (str[i] != 0); i++) //condition checking
所以,本质上,*(str+i)
是 条件检查语句 (类似于最广泛使用的条件检查语句 <
/ >
operators), 完全合法合法.
它的作用是,循环直到第i
个元素不为空。
A null
的十进制值为 0,FWIW。
在其最通用的形式中,for
循环包含以下元素:
for ( init-statement; condition-statement; iter-statement ) statement
每个元素中的内容都是非常开放的。在你的例子中,条件语句只是*(str+i)
。如果计算结果为非零值,将执行循环的 statement 部分。如果它的计算结果为零,则循环将终止。
当你想执行语句给定的次数时,你可以使用:
for ( i = 0; i < count; ++i ) { ... }
假设代码中的 str
指向空终止字符串,您正在对 str
中的所有字符执行 语句 。您的 for
循环相当于:
for (i = 0; str[i] != '[=12=]'; i++)
说法正确。
是的,我们可以将它用作 *(str+i) 它会 运行 直到字符串结束。
其中*在特定地址提供价值。
示例:
char str[5]={"test"};
cout<<*str; // it will always give default first index value
cout<<*(str+1) // it will display first character of string
所以当它到达字符串的末尾时它将变为空。
字符串的末尾始终为空字符。
那么循环将终止。
for (i = 0; *(str+i); i++)
{
//some code;
}
此语法中的第二个条件是什么意思?可以这么写吗?
*(str+i)
等同于 str[i]
,前提是 str
是指向某种数据类型的指针。这是一个有效的语法。
str
似乎是一个空终止字符串。当 *(str+i)
等于 '[=16=]'
.
false
是的。 str
是一个指针,因此当到达字符串空终止符 ('[=13=]'
) 时,条件将为假,使循环停止执行其主体。
假设字符串将是这样的:
str: 'a'|'b'|'[=10=]'
i: 0 | 1 | 2
所以当i
得到值2时,那么这个*(str+i)
就会得到0,所以你那时候的循环就是这样:
for (i = 0; 0; i++)
因为指针运算将导致 *(str+i)
指向字符串的最后一个条目。
此类循环通常用于具有可以转换为布尔值的标记值的数组。例如对于字符串。 (字符串以零字符结束)
例如这个循环计算字符串文字的长度"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;
或者在 C 中你可以使用 printf
printf( "The length of string literal %s is equal to %zu\n", str, i );
表达式*( str + i )
等同于str[i]
在 for 循环中,此表达式使用 like 条件等同于
*( str + i ) != 0
也就是刚转成类型bool
( bool ) *( str + i )
所以如果表达式等于 0 则它产生 false
否则 true
.
再举个例子。如果要输出程序参数那么可以这样写
#include <iostream>
int main( int argc, char *argv[] )
{
while ( *argv ) std::cout << *argv++ << std::endl;
}
C 中的 Ot
while ( *argv ) puts( *argv++ );
因为程序参数argv[]数组的最后一个元素总是等于NULL。
程序中的while循环相当于下面的for循环
for ( int i = 0; *( argv + i ); i++ )
或
for ( int i = 0; argv[i]; i++ )
来自 C++ 标准(5.2.1 下标)
1 A postfix expression followed by an expression in square brackets is a postfix expression. One of the expressions shall have the type “array of T” or “pointer to T” and the other shall have unscoped enumeration or integral type. The result is of type “T.” The type “T” shall be a completely-defined object type.65 The expression E1[E2] is identical (by definition) to *((E1)+(E2))
在C语言中也是如此
循环中的第二个语句检查条件是否为真。如果条件为真,循环继续;如果为假,则循环终止。此外,C 将 0
视为 false
,将任何非零值视为 true
。因此,如果 *(str+i)
非零,则计算结果为 true
,如果为零,则计算结果为 false
。由于 C 中的每个字符串都是一个以 [=16=]
结尾的字符数组(或零,其计算结果为 false
),查看字符串终止字符的计算结果为 false
,因此,该语句是合法有效。
关于为什么它在 C 中会这样发生的更多信息,这是在算术逻辑单元 (ALU) 的累加器中加载某些内容导致设置某些标志(例如 ACC 是否为零)的副作用.
为了清楚起见,for
循环结构
for (i = 0; *(str+i); i++)
可以重写为
for (i = 0; str[i]; i++) //pointer arithmetic
可以重写为
for (i = 0; (str[i] != 0); i++) //condition checking
所以,本质上,*(str+i)
是 条件检查语句 (类似于最广泛使用的条件检查语句 <
/ >
operators), 完全合法合法.
它的作用是,循环直到第i
个元素不为空。
A null
的十进制值为 0,FWIW。
在其最通用的形式中,for
循环包含以下元素:
for ( init-statement; condition-statement; iter-statement ) statement
每个元素中的内容都是非常开放的。在你的例子中,条件语句只是*(str+i)
。如果计算结果为非零值,将执行循环的 statement 部分。如果它的计算结果为零,则循环将终止。
当你想执行语句给定的次数时,你可以使用:
for ( i = 0; i < count; ++i ) { ... }
假设代码中的 str
指向空终止字符串,您正在对 str
中的所有字符执行 语句 。您的 for
循环相当于:
for (i = 0; str[i] != '[=12=]'; i++)
说法正确。 是的,我们可以将它用作 *(str+i) 它会 运行 直到字符串结束。 其中*在特定地址提供价值。
示例:
char str[5]={"test"};
cout<<*str; // it will always give default first index value
cout<<*(str+1) // it will display first character of string
所以当它到达字符串的末尾时它将变为空。 字符串的末尾始终为空字符。 那么循环将终止。