两个C语法小技巧:无初始化的"for"循环和char *w[4]与char w[4]的区别。

4

我正在学习Jon Bentley的C风格的Programming Pearls,想知道有人能否解释一下以下两个C语法片段:

一个没有初始化条件的for循环(请参见上面文件中wordncmp的第2行):

           for ( ; *p == *q; p++, q++)

并且在 IT 技术中,语义的差别也非常重要。

            char *word[800000];

and

            char word[800000];

因为我认为数组只是指向word[0]的指针。

答案选择解释:好的,像社区中的其他人一样,我在接受dmckee或CAbbott的答案之间犹豫不决。他们都有我欣赏的重要知识点。我接受了CAbbott的答案,因为它更简单,但给了dmckee一个赞。这是我能做到的最公平的方式,而不是接受两个答案。谢谢。


4
我将扮演“数组不是指针警察”的角色 :) “数组只是指针的坏习惯”:http://stackoverflow.com/questions/423823/whats-your-favorite-programmer-ignorance-pet-peeve/484900#484900 :) 你也可以阅读“数组表达式是左值”:https://dev59.com/l0bRa4cB1Zd3GeqP0Gpf#1072129。但首先请阅读第一个链接 :) - Johannes Schaub - litb
数组不是指针。然而,它们经常会衰变成指针。 - avakar
我喜欢那篇关于宠物恼人习惯的帖子。 - Dervin Thunk
谢谢。我把很多的心思和热爱都投入到了这里 =) - Johannes Schaub - litb
6个回答

6

已经有一段时间了,但以下应该是它们的区别:

for ( ; *p == *q; p++, q++)

这只是开发人员不想在for循环之前进行任何初始化。在这种情况下,开发人员只想遍历指针。

char *word[800000];
and 
char word[800000];

第一个声明了一个包含800000个char*的数组,第二个是包含800000个字符的数组。
希望对您有所帮助。

6
首先,pq已经设置好了(q指向一个现有的字符串,而p指向一个缓冲区,你计划将字符串复制到其中)。
其次,这里有一个字符数组和一个指向字符的指针数组之间的区别。
字符数组将占用 80000*sizeof(char) 字节(通常为80000)。指针数组将占用 80000*sizeof(char*) 字节,在32位系统上通常为320000字节,在64位系统上通常为640000字节。
两个数组都没有初始化。
指针数组可能打算指向一堆字符串。
最后,数组和指针不是相同的东西。我再说一遍,不是相同的东西。只是编译器需要时可以自由地将数组转换为指针。所以你可以在数组上使用指针算术运算。

1

一个没有初始条件的for循环并没有什么特别之处。每次循环开始时,条件仍将被检查以确定是否应该继续,并且最后一个表达式仍将在每次迭代结束时执行。

你问题中的for循环:

for (; *p == *q; p++, q++)

只要p和q指向的内容相等,就会循环执行。例如,如果p和q都是指向字符串的char *,则会一直循环,直到在字符串中找到第一个不同之处。


1
第一个问题并不太难。首先,初始化程序不是必需的,因为假定指针已经被初始化。
for(i = 0; i < 10; ++i) 
{
}

等同于

i = 0;
for ( ; i < 10; ++i) 
{
}

然后,理解指针就是一个问题。虽然理解这个例子很有用,但通常应避免使用那些循环。它们更难理解(尽管在那种情况下不是那么困难)。中间的基础结束条件(当*p!= *q时)对于C初学者来说可能也很困惑。

第二点很容易。在第一种情况下,您声明了一个数组,其中如果item是char*,则第二个数组是char的数组。您还应该注意声明这样的大型数组:如果需要大型数组,则应使用malloc/free,否则将耗尽堆栈。


0
一个没有初始条件的for循环意味着在for循环之前已经设置了初始条件。也许有一些伪代码,例如:
int i
if skipFirst then i=1 else i=0
for (; i < 10 ; i++) { ... }

其次,char *word[X] 表示数组中的每个元素都是一个 char* 或者是以 null 结尾的字符串。而 char word[X] 则是一个长度为 X 的单独的“字符串”,或者说是一个由长度为 X 的 char 型元素组成的一维数组。


0
x=a++, b++ means a++ and b++ and x = b
operator , can be used like in this example:
for (;;printf("hello!"), q++)

那不是令 OP 困惑的循环部分。 - Jonathan Leffler
1
"x=a++,b++" 的意思是 "x=a++" 和 "b++"。逗号的优先级比赋值运算符低。如果你要敢于发布一个谜题帖子,那么至少要尝试使其没有错误 :D - Johannes Schaub - litb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接