Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:Post增量产生相同的值_C++ - Fatal编程技术网

C++ C++;:Post增量产生相同的值

C++ C++;:Post增量产生相同的值,c++,C++,下列员额增额结果如下: 我的问题是为什么下面的结果是n=1,而不是n=3 如果代码是以n(++n)的预增量完成的,则结果是n=4,这是预期的结果。我知道第二个代码段一开始就不应该这样做,但我遇到过这样的事情,我很好奇为什么会这样 请告知。您的第二个示例是不允许的,并且具有未定义的行为。 如果需要这样的东西,应该使用临时变量。但你几乎不需要这样的东西 引述: 由于递增/递减运算符修改其操作数,因此使用 在同一表达式中,这样的操作数可以多次生成 未定义的结果。例如,在表达式中,例如x− ++x、 是

下列员额增额结果如下:

我的问题是为什么下面的结果是
n=1
,而不是
n=3

如果代码是以
n
++n
)的预增量完成的,则结果是
n=4
,这是预期的结果。我知道第二个代码段一开始就不应该这样做,但我遇到过这样的事情,我很好奇为什么会这样


请告知。

您的第二个示例是不允许的,并且具有未定义的行为。 如果需要这样的东西,应该使用临时变量。但你几乎不需要这样的东西

引述:

由于递增/递减运算符修改其操作数,因此使用 在同一表达式中,这样的操作数可以多次生成 未定义的结果。例如,在表达式中,例如x− ++x、 是的 不清楚减法运算符和增量运算符的顺序 应该执行。这样的情况在 编译器应用了优化,这可能导致 操作的执行顺序不同于 程序员有意的


其他答案正确地解释了此代码导致未定义的行为。您可能会感兴趣的是,为什么这种行为是您在编译器上看到的

就大多数编译器而言,表达式
x=n++
将编译为以下基本指令:

  • 拿一份n,称之为n_copy
  • 加1到n
  • 将n_副本分配给x
  • 因此表达式
    n=n++
    变为:

  • 拿一份n,称之为n_copy
  • 加1到n
  • 将n_副本分配给n
  • 这在逻辑上等同于:

  • 分配n到n
  • 这在逻辑上等同于:

  • 什么也不做

  • 这就是为什么在你的例子中,你会看到n==1。并非所有编译器都必须给出相同的答案。

    C++11标准中的其他示例包括:

    i = v[i++]; // the behavior is undefined
    i = 7, i++, i++; // i becomes 9
    i = i++ + 1; // the behavior is undefined
    i = i + 1; // the value of i is incremented
    f(i = -1, i = -1); // the behavior is undefined
    

    你的陈述
    n=n++导致未定义的行为。您看到的是将增量分配回
    n
    之前的值。在C++03中,这是未定义的行为(在序列点之间修改变量两次)。我记得,在C++11中,它被更改为定义良好的。让我查一下。@cheers-sandhth.-Alf-IIRC,边缘情况都涉及到预处理,比如
    i=++i,因为LHS和RHS的评估(包括
    i
    的增量)是在分配之前排序的。在
    i=i++,相对于赋值,增量仍然是未排序的,因此仍然是UB。@Cheersandhth.-Alf仍然未定义:1.9/15“如果标量对象上的副作用相对于同一标量对象上的另一副作用或使用同一标量对象的值计算的值是未排序的,则行为是未定义的。”@Angew这是我从来没有完全理解过的——赋值确实是在操作数求值之后排序的,但是操作数求值仍然是不排序的。例如,甚至似乎完全无视1.9/15或引用
    
    n = 1;
    n = n++;  //n = 1
    n = n++;  //n = 1
    n = n++;  //n = 1
    
    i = v[i++]; // the behavior is undefined
    i = 7, i++, i++; // i becomes 9
    i = i++ + 1; // the behavior is undefined
    i = i + 1; // the value of i is incremented
    f(i = -1, i = -1); // the behavior is undefined