C语言 后缀操作符真的比前缀具有更高的优先级吗?



然而,在优先级表中清楚地写着后缀操作符的优先级高于前缀操作符。但我仍然有一个疑问。
我从下面的例子开始:

*ptr++;   // evaluate as *(ptr++);
++*ptr;   // evaluate as ++(*ptr);

证明后置操作符的优先级高于前置操作符。

现在在下面的例子中,它似乎不正确:

int a=0,b,c;
b=a++;   //b=0 ,here it seems ++ has lower priority that is after assignment increment is performed.
c=++a;   //b=2 ,here it seems ++ has higher priority.

在上面的例子中,后缀操作符的优先级是否低于前缀操作符?

在您的第一个示例中,您比较*(pointer dereference)postfix/prefix操作符。

在这种情况下,

*(pointer dereference)的优先级与++(prefix)相等,但低于++(postfix)。还要注意前缀++和*具有从右到左的结合性,后缀++具有从左到右的结合性。

现在看*ptr++, ++是后缀,所以第一个后缀比*求值,因此是*(ptr++)

现在看++*ptr, ++是前缀,所以同等优先级,所以结合性将进入图片,*将首先求值(因为从右到左的性质),然后++,因此它的++(*ptr)

现在在第二个例子中,

b=a++ -> a++表示a上的后缀,所以先赋值后加值,但这是后缀的属性,所以a's的值会先加到b,然后再加a的值。

c=++a -> ++a表示在a上加前缀,所以先加a,再加a的值到c

这个例子只显示了这两个操作符的属性。它们的功能通过两种不同的操作来执行。为了比较它们的优先级,您必须举一个将两者都操作到单个语句中的示例。

示例可以是

int a=5,b;
b= a+++a;

现在这里的表达式将是a++ a而不是a++ a,因为后缀的优先级高于前缀。

由于提问者的误解,问题中的例子看起来是错误的。

因为i++i THEN POST-increment的返回值,所以++i是增加i然后返回值。

*p++也被设计成在PDP11上,strcpy可以写成while (*cd++ = *cs++);当value *cd == 0时,将str, cs复制到cd,直到结束NULL。

优先级,你在表中查找,如果你的编译器不遵循C标准,提交一个错误报告。一般来说,混合太多的副作用,如建议c = ++*p++表达式只是自找麻烦,你是预递增*p,后递减p,这不是你所期望的。这些操作应用于不同的内存位置,因此无法告诉您操作符的优先级。

(++*bar)++;这样使用括号的表达式不会编译,因为(++*bar)不是l值,这反驳了问题中的假设,非常简单:

bar = foo;  ++*(bar++); puts( foo); putchar( 'n');
bar = foo;  (++*bar)++; puts( foo); putchar( 'n');

在第二行产生错误:

prog.c:9:22: error: lvalue required as increment operand
bar = foo; (++*bar)++; puts( foo3); putchar( 'n');
                   ^

不是第一个,这表明++有优先权

最新更新