A.s*_*lar 3 c operator-precedence prefix-operator postfix-operator
但是,在优先级表中明确写出后缀运算符的优先级高于前缀.但我仍然有一个daubt.
我从以下示例开始:
*ptr++; // evaluate as *(ptr++);
++*ptr; // evaluate as ++(*ptr);
Run Code Online (Sandbox Code Playgroud)
这证明后缀运算符的优先级高于前一个.
现在在下面的示例中,它似乎不正确:
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.
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,似乎postfix运算符的优先级低于前缀吗?
在您的第一个示例中,您正在*(pointer dereference)与postfix/prefix运营商进行比较.
*(pointer dereference)在这种情况下,具有相同的优先级++(prefix)但优先级低于++(postfix).另请注意,前缀++和*具有从右到左的关联性,而++ postfix 从左到右.
现在看*ptr++,++是postfix所以第一个postfix的评估比*,因此它*(ptr++).
现在看++*ptr,++是前缀,所以相同的优先级,所以关联性将进入图片,*将首先评估(因为从右到左的性质)然后++因此它++(*ptr).
现在在你的第二个例子中,
b=a++- > a ++表示postfix on a,所以首先赋值,然后递增,但这是postfix的属性,所以a'svalue会进入b然后a会递增.
c=++a- > ++ a表示a上的前缀,因此首先a递增,然后值a进入c.
此示例仅显示两个运算符的属性.它们的功能在两个不同的操作上执行.要比较它们的优先级,您必须举例说明两者都在一个语句中运行.
例子可以是
int a=5,b;
b= a+++a;
Run Code Online (Sandbox Code Playgroud)
现在这里的表达式将是++ + a,而不是+ ++ a,因为postfix的优先级高于prefix.
由于提问者的误解,所讨论的例子似乎是错误的。
因为THEN POSTi++的返回值是自增,是自增然后返回值。i++ii
还被*p++设计为在 PDP11 上strcpy可以写为while (*cd++ = *cs++);
将 str、cs 复制到 cd,直到当值 *cd == 0 时终止 NULL。
优先,你查一下表,如果你的编译器不遵循C标准,提交一个错误报告。一般来说,混合太多像建议c = ++*p++表达式这样的副作用只是自找麻烦,你预先递增 *p,后递减 p,这不是你所期望的。这些操作应用于不同的内存位置,因此不会告诉您有关运算符优先级的信息。
使用括号的表达式(++*bar)++;不会编译,因为 (++*bar) 不是左值,这反驳了问题中的假设,非常简单:
bar = foo; ++*(bar++); puts( foo); putchar( '\n');
bar = foo; (++*bar)++; puts( foo); putchar( '\n');
Run Code Online (Sandbox Code Playgroud)
在第二行产生错误:
prog.c:9:22: error: lvalue required as increment operand
bar = foo; (++*bar)++; puts( foo3); putchar( '\n');
^
Run Code Online (Sandbox Code Playgroud)
不是第一个,表明 ++ 具有优先权。