对于 sizeof(x) VS 而 ([x] != '\0') 在 C 中



我只是想知道使用

for(i = 0; i < sizeof(argv[1]) / sizeof(argv[1][0]); i++) {

while (argv[1][i] != '')

我只是好奇,我找不到任何关于它的信息。

(目的是putcharchar*的每一个字符)

这两个条件有本质区别。

表达式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(i = 0; i < sizeof( s ) / sizeof( s[0]); i++) {

相当于

for(i = 0; i < 6; i++) {

因为终止零也包含在数组中。即循环的主体也将获得字符''的控制权。

虽然这个循环

while ( s[i] != '')

遇到字符''时停止其迭代。

这是一个演示程序,显示了差异。程序输出符号的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] != '' )
{
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++) {

方法:

  1. i设置为0

  2. 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++] != '')

有 2 个区别:

  1. 在第二个中,i永远不会设置为0

  2. 在第二个中,i永远不会递增(尽管在循环本身中它可能会增加)

相关内容

  • 没有找到相关文章

最新更新