x = x +++++ x的评估顺序将是多少;是?[英] What would the evaluation order of x = x++ + ++x; be?

本文是小编为大家收集整理的关于x = x +++++ x的评估顺序将是多少;是?的处理方法,想解了x = x +++++ x的评估顺序将是多少;是?的问题怎么解决?x = x +++++ x的评估顺序将是多少;是?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

可能的重复:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i ++等…)

在Java中,评估顺序指定为从左到右. C和C ++也是如此,还是实现取决于?我确实记得评估顺序未指定用于函数参数,但是子表达式呢?

推荐答案

未指定的是+的哪个参数首先进行评估 - 但这甚至无关紧要,因为在C和C ++中,在没有中间序列的情况下两次修改相同的对象是完全不确定的行为.

在这里,您正在修改x 三次没有中间序列,所以您陷入了的范围,这里是dragonnes 领域;)


C99标准的相关部分是" 6.5表达式":

2在上一个和下一个之间 对象应具有的序列点 它的存储值最多一次修改 通过评估表达. 此外,先前的价值应为 仅阅读以确定值 存储.

3运营商的分组 操作数由 句法.除非稍后指定 (对于function-call(),&&,||,?:,,,, 和逗号运营商), 评估子表达和 顺序进行哪个副作用

均未指定.


可以编写证明未指定评估顺序的法律代码 - 例如:

#include <stdio.h>

int foo(void)
{
    puts("foo");
    return 1;
}

int bar(void)
{
    puts("bar");
    return 2;
}

int main()
{
    int x;

    x = foo() + bar();
    putchar('\n');

    return x;
}

(是否获得foobar或barfoo的输出,未指定).

其他推荐答案

C ++ 03标准5.4

除了指出, 评估个人操作数 操作员和子表达 个人表达和秩序 发生哪个副作用是 未指定的53) 下一个序列指向标量 对象应有其存储的价值 最多一次修改 评估表达. 此外,先前的价值应为 仅访问以确定值 存储.此要求 每个段落应为每个段落 允许订购 完整表达的子表达; 否则行为是不确定的.

...因此,未定义和实现依赖.

其他推荐答案

C标准不能保证在插入前后实际上会"发生"后"发生".因此,这是不确定的行为.

本文地址:https://www.itbaoku.cn/post/359045.html