post和pre increment,c ++中的减量

shi*_*arg 6 c++

#include <iostream>
using namespace std;

void f(int x, int y){

        cout << "x is " << x << endl;
        cout << "y is " << y << endl;
}



int main(){

        int i = 7;
        f(i--,i-- );
        cout << i << endl<< endl;
}
Run Code Online (Sandbox Code Playgroud)

我们预计程序打印"x是7 \ny是6 \ni是5"

但程序打印"x是6 \ny是7 \ni是5"

Pra*_*rav 11

f(i--,i-- );调用未定义的行为.不要写这样的代码.

编辑:

,以上表达式中出现的逗号不是Comma operator.它只是一个分隔参数的分隔符(它不是一个序列点.)

此外,函数参数的求值顺序是Unspecified,但表达式调用Undefined Behavior,因为您试图i在两个序列点之间修改两次.

我很累.:(

  • @Swisstack:参数评估顺序是未指定的,因此它可以按照它们在堆栈上的推送顺序而不是.C/C++并不向你保证.在这种情况下,"i"的值在同一表达式中被修改两次(其间没有任何序列点).如果这样做,则行为未定义.(参见§5/ 4"在前一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值.") (4认同)