对于 C 中的 sizeof(x) VS while ([x] != '\0')
for sizeof(x) VS while ([x] != '\0') in C
我只是想知道使用
是否有区别
for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {
和
while (argv[1][i] != '[=11=]')
我只是好奇,我找不到任何相关信息。
(objective是putchar
char*
的每一个字符)
这两个条件有本质区别
表达式 argv[1]
是一个类型为 char *
的指针,通常占用 4 或 8 个字节,具体取决于所使用的系统,等于表达式 sizeof(argv[1]) / sizeof(argv[1][0])
的值或表达式 sizeof( argv[1] )
的等效项,因为 sizeof( argv[1][0] )
与 sizeof( char )
相同,而最后一个始终等于 1
另一方面,指针可以指向比 4 或 8 个字符多(或少)的字符串。
但即使您将 sizeof
运算符应用于声明为例如
的字符数组(而不是指针)
char s[] = "Hello";
那么即使在这种情况下,循环的条件也会不同。就是这个for循环
for(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {
等同于
for(i = 0; i < 6; i++) {
因为终止零也包含在数组中。也就是说,循环体也将获得字符 '[=24=]'
.
的控制权
虽然这个循环
while ( s[i] != '[=13=]')
在遇到字符 '[=24=]'
时停止迭代。
这是一个显示差异的演示程序。程序输出符号的ASCII码。
#include <stdio.h>
int main(void)
{
char s[] = "Hello";
for ( size_t i = 0; i < sizeof( s ) / sizeof( s[0]); i++ )
{
printf( "%d ", s[i] );
}
putchar( '\n' );
size_t i = 0;
while ( s[i] != '[=14=]' )
{
printf( "%d ", s[i] );
++i;
}
putchar( '\n' );
return 0;
}
程序输出为
72 101 108 108 111 0
72 101 108 108 111
它们不是一回事(尽管它们很接近)。
第一个
for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {
表示:
将i
设置为0
sizeof(argv[1]) / sizeof(argv[1][0])
表示strlen(argv[1])
,所以表示
while i is less than the length of argv[1]
这与
基本相同
int i = 0;
while(argv[1][i++] != '[=12=]')
有两个区别:
在第二个中,i
永远不会设置为 0
在第二个中,i
永远不会增加(尽管在循环本身中它可能会增加)
我只是想知道使用
是否有区别for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {
和
while (argv[1][i] != '[=11=]')
我只是好奇,我找不到任何相关信息。
(objective是putchar
char*
的每一个字符)
这两个条件有本质区别
表达式 argv[1]
是一个类型为 char *
的指针,通常占用 4 或 8 个字节,具体取决于所使用的系统,等于表达式 sizeof(argv[1]) / sizeof(argv[1][0])
的值或表达式 sizeof( argv[1] )
的等效项,因为 sizeof( argv[1][0] )
与 sizeof( char )
相同,而最后一个始终等于 1
另一方面,指针可以指向比 4 或 8 个字符多(或少)的字符串。
但即使您将 sizeof
运算符应用于声明为例如
char s[] = "Hello";
那么即使在这种情况下,循环的条件也会不同。就是这个for循环
for(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {
等同于
for(i = 0; i < 6; i++) {
因为终止零也包含在数组中。也就是说,循环体也将获得字符 '[=24=]'
.
虽然这个循环
while ( s[i] != '[=13=]')
在遇到字符 '[=24=]'
时停止迭代。
这是一个显示差异的演示程序。程序输出符号的ASCII码。
#include <stdio.h>
int main(void)
{
char s[] = "Hello";
for ( size_t i = 0; i < sizeof( s ) / sizeof( s[0]); i++ )
{
printf( "%d ", s[i] );
}
putchar( '\n' );
size_t i = 0;
while ( s[i] != '[=14=]' )
{
printf( "%d ", s[i] );
++i;
}
putchar( '\n' );
return 0;
}
程序输出为
72 101 108 108 111 0
72 101 108 108 111
它们不是一回事(尽管它们很接近)。
第一个
for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {
表示:
将
i
设置为0
sizeof(argv[1]) / sizeof(argv[1][0])
表示strlen(argv[1])
,所以表示
while i is less than the length of argv[1]
这与
基本相同int i = 0;
while(argv[1][i++] != '[=12=]')
有两个区别:
在第二个中,
i
永远不会设置为0
在第二个中,
i
永远不会增加(尽管在循环本身中它可能会增加)