C中后缀和前缀之间括号的优先顺序

时间:2011-07-24 14:25:06

标签: c operators

C Operator Preference Table注意到()的优先级更高。

代码:

# include <stdio.h>
int main()
{
    int temp=2;
    (temp += 23)++;    //Statement 1
    ++(temp += 23);    //Statement 2
    printf("%d",temp);
    return 0;
}

我的问题是,当括号中的优先级高于语句2中的预先修复运算符时,为什么会出现错误。 在声明1中,两者具有相同的优先级,但评估顺序是从左到右。还是一样的错误。 第三个疑问:operator + =优先级低得多,那么为什么会导致错误。

error: lvalue required as increment operand

2 个答案:

答案 0 :(得分:6)

lvalue是可以分配其他值的值(因为它位于赋值运算符的左侧)。 (temp += 23)rvalue。没有任何东西可以分配给它。

答案 1 :(得分:2)

我想添加的其他内容是,您似乎在尝试在表达式中多次修改值。根据C99标准6.5(2),这是未定义的行为

  

在上一个和下一个序列点之间,对象应具有其存储值   通过表达式的评估最多修改一次。此外,先前的价值   应该只读以确定要存储的值。

脚注71)显示了这个例子:

  

此段落呈现未定义的语句表达式,例如

i = ++i + 1;

a[i++] = i;
     

允许

i = i + 1;

a[i] = i;