7

但是在优先级表中清楚地写着后缀运算符的优先级高于前缀。但我仍然有一个疑问。
我从以下示例开始:

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

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

4

2 回答 2

14

在您的第一个示例中,您正在*(pointer dereference)postfix/prefix运营商进行比较。

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

现在看*ptr++,++ 是后缀,所以第一个后缀的计算值比 *,因此它的*(ptr++).

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

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

b=a++-> a++ 表示后缀在 上a,所以先赋值后自增,但这是后缀的属性,所以a's值会进入ba自增。

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

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

该示例可以是

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

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

于 2014-07-04T18:51:53.720 回答
2

由于提问者的误解,有问题的示例仅出现错误。

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

*p++被设计成在 PDP11 上,strcpy可以写成将while (*cd++ = *cs++); str、cs 复制到 cd,直到值 *cd == 0 时终止 NULL。

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

使用括号 like 的表达式(++*bar)++;无法编译,因为 (++*bar) 不是左值,这很简单地反驳了问题中的假设:

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');
                   ^

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

于 2014-07-04T18:16:06.440 回答