【问题标题】:Precedence of parentheses between post-fix and pre-fix in CC中后缀和前缀之间括号的优先级
【发布时间】:2011-07-24 14:25:05
【问题描述】:

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 中,两者具有相同的优先级,但评估顺序是从左到右。还是同样的错误。 第三个疑问:运算符 += 的优先级要低得多,那么为什么会导致错误。

error: lvalue required as increment operand

【问题讨论】:

  • 有什么理由需要这种复杂的代码?
  • @Laurent:没有具体原因。只是在令人困惑的主题上检查我自己的技能。

标签: c operators


【解决方案1】:

lvalue 是一个可以分配其他值的值(因为它位于赋值运算符的左侧)。 (temp += 23)rvalue。什么都不能分配给它。

【讨论】:

  • 我认为 temp += 23 应该等于 temp = temp + 23。但现在似乎没有分号(;)这是不相等的。我说的对吗?
  • 两者是等价的;也不是左值。您不能分配给表达式temp = temp + 23,因为它只引用一个值而不是存储位置。
  • 是的,但你也不能做(temp = temp + 23) = 5,所以(temp = temp + 23)rvalue。他们是平等的。
【解决方案2】:

我想补充一点,您似乎正试图在表达式中多次修改一个值。这是根据 C99 标准 6.5(2) 的未定义行为

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

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

本段呈现未定义的语句表达式,如

i = ++i + 1;

a[i++] = i;

同时允许

i = i + 1;

a[i] = i;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2016-07-22
    • 2013-02-27
    • 2015-09-16
    相关资源
    最近更新 更多