我试图理解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.
有人可以对此有所了解吗?
答案 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"