函数参数中预增量和后增量的运算顺序?

时间:2010-06-07 13:04:41

标签: c post-increment pre-increment

我有一些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传入了两个参数++aa++。有人可以解释操作顺序来解释结果吗?

以上代码根据使用的编译器打印“3 13”或“2 23”。

4 个答案:

答案 0 :(得分:28)

嗯,您的示例代码需要考虑两件事:

  1. 未指定函数参数的评估顺序,因此首先评估++aa++是否依赖于实现。
  2. 在修改之间没有序列点的情况下多次修改a的值会导致未定义的行为。因此,您的代码结果未定义。
  3. 如果我们简化您的代码并删除未指定和未定义的行为,那么我们可以回答这个问题:

    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

我希望这会有所帮助!!

相关问题