2010-09-25 68 views
6
#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; 
} 

我们预期的程序以打印 “x为7 \ ny表示6 \ ni为5”柱和预递增,递减在C++

但印刷“的节目x为6 \ ny表示7 \ ni is 5“

回答

11

f(i--,i--);调用Undefined Behaviour。不要写这样的代码。

EDIT

逗号,存在于上述表达式不是Comma operator。它只是一个分隔参数(而不是序列点)的分隔符。

此外,函数参数的评估顺序是未指定的,但表达式会调用未定义的行为,因为您试图修改i两次两个序列点。

乌夫我累了。 :(

+0

完全同意在同一语句中两次使用{in,de}加载操作符是非常糟糕的 – Benoit 2010-09-25 11:07:42

+1

@Downvoter:答案是完全正确的,请解释你的downvote。 – 2010-09-25 11:11:39

+0

@Svisstack:函数调用中出现的'','不是'逗号操作符',它只是一个分隔符,它不是一个序列点。 – 2010-09-25 11:15:43

2

这告诉你参数正在从右到左评估,而不是从左到右,这可能是因为调用约定或其他原因,但它通常是一个坏主意依赖于函数参数评估的顺序

+0

这是调用约定,参数从右到左到堆栈 – Aillyn 2010-09-25 13:55:58

+0

@Aillyn:错误。它们可能是它的编译器工作原理,但它并没有在标准中实际定义。谁说这些参数甚至放在堆栈上进行函数调用。 (如果这是C,你可能会更正确,但这是C++和ABI未定义(故意))。 – 2010-09-25 18:29:16