Postfix运算符确实具有比前缀更高的优先级吗?

时间:2014-07-04 17:53:08

标签: c operator-precedence postfix-operator prefix-operator

然而,在precedence table中明确写出后缀运算符的优先级高于前缀。但我仍然有一个涂抹 我从以下示例开始:

*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.

在上面的示例中,似乎后缀运算符的优先级低于前缀?

2 个答案:

答案 0 :(得分:8)

在第一个示例中,您要将*(pointer dereference)postfix/prefix运算符进行比较。

在这种情况下,

*(pointer dereference)具有与++(prefix)相同的优先级,但优先级低于++(postfix)。另请注意,前缀++和*具有从右到左关联性,而++ postfix从从左到右

现在看*ptr++,++是postfix,所以第一个postfix被评估为*,因此它是*(ptr++)

现在看++*ptr,++是前缀,所以相同的优先级,所以关联性将会出现,*将首先评估(因为从右到左的自然)然后++因此它++(*ptr)

现在在你的第二个例子中,

b=a++ - > a ++表示a上的 postfix ,因此首先分配值然后递增,但这是postfix的属性,因此a's值将进入b然后a将递增。

c=++a - > ++ a表示前缀在a上,因此首先a递增,然后a的值进入c

此示例仅显示两个运算符的属性。它们的功能在两个不同的操作上执行。要比较它们的优先级,您必须举例说明两者都在一个语句中运行。

示例可以是

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

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

答案 1 :(得分:1)

由于提问者的误解,有问题的例子只显得有误。

由于i++的返回值为i,因此POST增量,++i为增量i,然后返回值。

同样*p++的设计使得在PDP11上,strcpy可以写为while (*cd++ = *cs++); 将str,cs复制到cd,直到值为* cd == 0时终止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');
                   ^

不是第一个,表明++具有优势。