试图理解参数的评估(如果涉及某些算术运算)传递给函数

时间:2015-02-10 04:58:49

标签: c++ c gcc

我试图理解cdecl调用约定,我偶然发现了这种奇怪的行为。

根据cdecl标准,调用函数将从右到左的参数存储到堆栈,然后调用目标函数。所以我假设参数将从左到右进行评估,因为它类似于堆栈流,或者它仍然可以从右到左进行评估,给定cdecl约定来存储参数。

但是下面的节目输出让我感到困惑。下面是我编写的一个简单程序,用于理解参数的评估。

void fun (int a, int b, int c) {    
    printf("a: %d, b: %d, c: %d\n", a, b, c);
}    

int main()    
{
    int i = 2; 
    fun(i, i++, i);
}  

预期输出:a: 3, b: 2, c: 2 or a: 2, b: 2, c: 3

实际输出:a: 3, b: 2, c: 3

 gcc --version
 gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
 Copyright (C) 2013 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:0)

这是一个常见的混淆:有两个一元运算符递增一个数字:var++++var。 在将变量的值传递给函数后,var++将向变量添加一个变量,而++var将在传递数据之前添加一个这个功能。

尝试更改++运算符的位置,看看会发生什么。

快速举例:

#include <iostream>
int main() {
     int i = 5;
     std::cout << i << std::endl; //Prints "5"
     std::cout << i++ << std::endl; //Also prints "5", but after i is 6
     std::cout << ++i << std:: endl; //Prints "7"