然而,在优先级表中清楚地写着后缀操作符的优先级高于前缀操作符。但我仍然有一个疑问。
我从下面的例子开始:
*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');
^
不是第一个,这表明++有优先权