然而,在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.
在上面的示例中,似乎后缀运算符的优先级低于前缀?
答案 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');
^
不是第一个,表明++具有优势。