【问题标题】:Confusion about operator precedence in c++C++中运算符优先级的混淆
【发布时间】:2021-09-30 06:31:32
【问题描述】:

我正在学习 c++,目前正在学习运算符优先级。我正在玩以下示例。将每个部分想象成在不同时间运行的不同代码段,而不是同一方法中的多个代码块。

int b = 4;
int result = ++b;

// In the above example the result will be 5, as expected.
int b = 4;
int result = ++b + b; 

// Here the result will be 10 as expected.
int b = 4;
int result = ++b + ++b;

这里的结果是 12。我不明白为什么。编译器不应该评估 ++b 将 4 更改为 5,然后将 ++b 更改为 6,从而导致 5+6 = 11?

【问题讨论】:

    标签: c++ c++17 operators operator-precedence


    【解决方案1】:

    这是未定义的行为,violating sequence rules

    在上一个和下一个sequence points 之间,标量对象的存储值最多只能通过表达式的求值修改一次,否则行为未定义。

    int b = 4;
    int result = ++b + ++b;
    

    【讨论】:

    • 自 C++03 以来就没有使用过术语“序列点”,但你说得对,它是未定义的行为。
    • @Elliott 该术语在 C++11 之后被替换为排序
    • 这仍然是 c++17 中的问题吗?我将不得不阅读更多关于未定义行为的内容。我不明白为什么它会随机选择 12,并确定性地选择它。应该是11吧?你能解释一下什么是序列点吗?
    • 是的,是的,当然你应该已经有很多可用的材料,例如refer this。在其他语言中可以,但 C++ 对此没有任何决定性的行为。我当然可以,但是已经有很多可用的解释,例如 sequence point ,我将重复已经存在的内容。
    • @JeremyFisher 结果是由于:增量 b;增加 b;将 b 添加到 b 给出结果。这不是“随机的”,排序规则隐含允许这种操作顺序,因为表达式具有未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 2017-06-02
    相关资源
    最近更新 更多