-1

有人写这个函数

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

我问,为什么你把 * 放在 p++ 之前?

回答:因为“都是一样的”,所以我更正了代码,然后生气了一会儿,因为两者的工作原理是一样的……

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

所以我想和stackoverflow分享这个,例如:

字符 s[6]="你好";

它会做什么?

*++ptr;

这将评估 ++ 预增量(在指针上),然后是取消引用运算符 *,因此它将让一个 char 值 'e'(“hello”的第二个字母)(在这种情况下不使用并且可以生成编译警告)并且指针将指向“e”(位置 1)

它会做什么?

*ptr++;

这有点奇怪,因为它会首先评估取消引用运算符 *,所以它会让一个 char 值 'h' (在这种情况下都没有使用),然后是 ++ 后增量(到指针),所以(再次)指针将从“e”(位置 1)指向

它会做什么?

ptr++;

最后它不会有 char 的左值,但如果不使用它不会产生任何警告,并且指针也会从 'e'(位置 1)指向。

从指针地址的角度来看,这三种形式的作用相同。

恕我直言,这是某些计算机语言(几乎所有人)中最糟糕的事情。

“任何代码和任何错误之间的汉明距离都很差”

我们在编程时没有冗余,如果你拿一本法律书,在里面写随机字符,它是可读的,但是如果你在编程时输入随机,你会得到一个错误,100% 准确

4

3 回答 3

2

++ 优先于 *。但我同意,当你在同一个声明中混合使用两者时还不清楚。

于 2010-06-24T13:07:03.330 回答
2

根据 C 中的运算符优先级,++将首先评估,然后才评估*。因此 in *p++,ptr将使其值递增,然后该语句将获得ptr现在指向的对象的值。当然,这与 没有什么不同ptr++,因为您没有使用语句的值。

于 2010-06-24T13:07:46.340 回答
1

任何将 ++、--、+= 等与其他运算符混合使用的人都已经无法编写可读的代码,他们会出错的事实只不过是他们应得的。

于 2010-06-24T13:11:57.313 回答