使用类似的东西是不好的做法:
*str++;
VS
*str;
str++;
str
定义为char str[];
的位置?
虽然他们做了同样的事情,但似乎第一个可能更容易出错,因为做一些像(*str)++
这样的事情会导致编译器错误,即使它似乎就像我们正在做的那样。
答案 0 :(得分:3)
本身,这不是一种不好的做法
strcpy
的规范定义类似于
while ( *src )
*dst++ = *src++;
你只是想知道它真的按照你的意图行事;你正在获得str
指向的值,并且作为副作用你正在递增指针。
您还想了解*str++
和(*str)++
之间的区别;第二个增加str
指向的值,而不是str
本身。
您还想知道在评估表达式后不必立即应用副作用;它只需要在下一个序列点之前应用(已经评估了所有表达式并且已经应用了所有副作用的点)。在上面的示例中,dst
和src
都会在语句结束时递增,但不能保证它们以任何特定顺序递增,或者它们在赋值之前或之后递增地点。你想避免写*str = *str++
这样的表达式;行为未定义。
答案 1 :(得分:3)
*str++
是个性的。期望程序员在没有括号的情况下知道它意味着什么是安全的。
符号已经存在,并且意味着要使用。来自K& R:
/* strcpy: copy t to s; pointer version 3 */ void strcpy(char *s, char *t) { while (*s++ = *t++) ; }
虽然这看起来似乎很神秘,但是很明显 方便性很大,应该掌握成语,因为 你会在C程序中经常看到它。
答案 2 :(得分:2)
*str++;
递增str
指针。在C中,数组名称是静态指针,因此您无法递增它。并且(*str)++
在索引零处递增值。
答案 3 :(得分:1)
这并不是一种非常糟糕的做法,因为它在旧代码中大量使用。作为一个个人观点,我只是对最终不会成为C算子优先级专家的读者保持谨慎(我承认我属于那个类别......)
所以我几乎总是使用括号来消除歧义:
(*str)++;
但是我只使用真正的指针而不是数组,即使它们被声明为未知大小,仍然是为了避免在以后维护代码时可能出现的错误。
所以恕我直言,
是可以的char *str;
但我不会将它用于
char str[];
(如果我(或其他程序员)稍后写char str[SIZE]
怎么办?)