注意C/C ++中 *和++的优先级,(编程时的任何击键)[关闭
-
29-09-2019 - |
题
有人写这个功能
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分享,例如:
char s [6] =“ Hello”;
它会做什么?
*++ptr;
这将评估++的预入(在指针上),然后评估删除操作员 *,因此它将让char值'e'(“ Hello”的第二个字母)(在这种情况下不使用,可以生成关于编译的警告),指针将从“ E”指向(位置1)
它会做什么?
*ptr++;
这有点奇怪,因为它将首先评估解雇操作员 *,因此它将让char值'h'(在这种情况下既不使用),然后再用++后插入后(指向指针),所以(再次)指针将从“ E”指向(位置1)
它会做什么?
ptr++;
最后,它不会有char的lvalue,但是如果不使用,它不会产生任何警告,并且指针也将从“ e”(位置1)指向。
这三种形式从指针地址的角度来做相同。
恕我直言,这是某些计算机语言中最糟糕的事情(几乎所有人)。
“任何代码和任何错误之间的锤击距离都很差”
编程时我们没有任何冗余,如果您拿一本法律书并在其中编写随机字符,它将是可读的,但是如果您在编程时键入随机,则会获得错误,100%准确性
解决方案
++具有优先 *。但是我同意,目前尚不清楚您在同一陈述中混合时。
其他提示
根据C的操作员优先级 ++
将首先评估,只有这样 *
. 。所以 *p++
, ptr
将使其价值分开,然后该语句将获得opbject的值 ptr
现在指的是。当然,这与 ptr++
, ,因为您不使用语句的值。
任何将++, - , +=等混合的人已经失败了编写可读代码,他们会把它弄出来的事实不过是他们的到期。
不隶属于 StackOverflow