使用* str ++是不好的做法吗?

时间:2014-12-23 16:09:56

标签: c

使用类似的东西是不好的做法:

*str++;

VS

*str;
str++;

str定义为char str[];的位置?

虽然他们做了同样的事情,但似乎第一个可能更容易出错,因为做一些像(*str)++这样的事情会导致编译器错误,即使它似乎就像我们正在做的那样。

4 个答案:

答案 0 :(得分:3)

本身,这不是一种不好的做法

strcpy的规范定义类似于

while ( *src )
  *dst++ = *src++;

你只是想知道它真的按照你的意图行事;你正在获得str指向的值,并且作为副作用你正在递增指针。

您还想了解*str++(*str)++之间的区别;第二个增加str指向的值,而不是str本身。

您还想知道在评估表达式后不必立即应用副作用;它只需要在下一个序列点之前应用(已经评估了所有表达式并且已经应用​​了所有副作用的点)。在上面的示例中,dstsrc都会在语句结束时递增,但不能保证它们以任何特定顺序递增,或者它们在赋值之前或之后递增地点。你想避免写*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]怎么办?)