我有一些C代码:
main()
{
int a=1;
void xyz(int,int);
xyz(++a,a++); //which Unary Operator is executed first, ++a or a++?
printf("%d",a);
}
void xyz(int x,int y)
{
printf("\n%d %d",x,y);
}
函数xyz
传入了两个参数++a
和a++
。有人可以解释操作顺序来解释结果吗?
以上代码根据使用的编译器打印“3 13”或“2 23”。
答案 0 :(得分:28)
嗯,您的示例代码需要考虑两件事:
++a
或a++
是否依赖于实现。a
的值会导致未定义的行为。因此,您的代码结果未定义。如果我们简化您的代码并删除未指定和未定义的行为,那么我们可以回答这个问题:
void xyz(int x) { }
int a = 1;
xyz(a++); // 1 is passed to xyz, then a is incremented to be 2
int a = 1;
xyz(++a); // a is incremented to be 2, then that 2 is passed to xyz
答案 1 :(得分:10)
引用Kernighan& Ritchie,第2.12章:
函数参数的顺序 被评估的是未指定的,所以 声明
printf("%d %d\n", ++n, power(2, n)); /* WRONG */
可以产生不同的结果 不同的编译器,取决于 n是否在上电之前递增 叫做。当然,解决方案是 写
++n; printf("%d %d\n", n, power(2, n));
函数调用,嵌套赋值 陈述,增量和 递减运算符导致``side effects'' - 一些变量被改变了 作为评价的副产品 一种表达。在任何表达中 涉及副作用,可以 对订单的细微依赖 哪些变量参与了 表达式已更新。一个人不高兴 情况以陈述
为代表a[i] = i++;
问题是下标是否存在 是我或新的旧价值。 编译器可以解释这一点 不同的方式,生成不同 答案取决于他们 解释。标准 故意留下大部分此类事项 不确定的。当副作用 (分配给变量)发生 在表达式中留给 由于编译器的自由裁量权 最佳订单很大程度上取决于机器 建筑。 (标准确实如此 指定所有副作用 参数在a之前生效 函数被调用,但那不会 帮助上面打印printf。) 道德是编写代码 取决于评估顺序是一个 任何糟糕的编程习惯 语言。当然,这是必要的 要知道要避免什么,但是如果 你不知道他们是如何完成的 各种机器,你不会受到诱惑 利用特定的优势 实施
答案 2 :(得分:1)
函数的一元运算符求值序列:
#include <stdio.h>
void xyz(int x, int y) {
printf("x:%d y:%d ", x, y);
}
main() {
int a;
a=1; xyz(++a, a); printf("a:%d\n", a);
a=1; xyz(a, a++); printf("a:%d\n", a);
a=1; xyz(++a, a++); printf("a:%d\n", a);
}
将输出
x:2 y:2 a:2
x:2 y:1 a:2
x:3 y:1 a:3
在我的系统上。这表示首先评估函数的第二个参数。您不应该依赖于功能参数的评估顺序。它没有定义,因此在不同的系统上会有所不同。
尽管如此,找到这个行为的漂亮例子还是很好的。
答案 3 :(得分:-1)
对于一元运算符,有预增量(++ i)和后增量(i ++)。对于预增量,将在操作之前添加要增加的值。例如:
#include <iostream>
using namespace std;
void main()
{
int i = 0;
cout << ++i;
}
在这种情况下,输出将是1.在任何其他操作之前,变量'i'增加值1,即'cout&lt;&lt; ++ I”
现在,如果我们在同一个函数中进行后增量:
#include <iostream>
using namespace std;
void main()
{
int i = 0;
cout << i++;
}
输出仅为0.这是因为增量将在操作后发生。但是既然你想知道如何将它们作为参数传递,那么它就是这样的:
#include <iostream>
using namespace std;
// Function Prototypes
void PrintNumbers(int, int);
void main()
{
int a = 0, b = 0;
PrintNumbers(++a, b++);
}
void PrintNumbers(int a, int b)
{
cout << "First number: " << a << endl;
cout << "Second number: " << b << endl;
}
当将这些变量作为参数传递时,输出将为:
First number: 1
Second number: 0
我希望这会有所帮助!!