评估订单和printf中的打印

时间:2014-04-01 16:54:37

标签: c printf

我已经看过关于i ++ ++ i等的问题,但我有一个小的,有点不同的问题。 假设我有这样的事情:

 printf("%d %d", P, P);

和P是一个函数

 int P(){
      printf("HEY");
      return 0;
 }

将要打印什么 HEYHEY00或HEY0HEY0?

2 个答案:

答案 0 :(得分:3)

跑吧。

这个程序:

#include <stdio.h>

int P(){
  printf("HEY");
  return 0;
}
int main() {
  printf("%d %d", P(), P());
  return 0;
}

输出:

HEYHEY0 0

为什么呢?在实际输入printf的代码之前,会对参数进行求值(P被调用)。

编辑:根据@Shafik bellow,C标准保证参数评估的顺序,所以如果有两个函数具有不同的字符串,那么这些字符串的顺序就不会是可以预测的。

答案 1 :(得分:2)

根据标准对 printf()中的参数进行评估是未定义的。但它只在对参数进行全面评估后打印。 所以在上面的例子中,首先评估p()&,然后当他们评估时打印&#34; HEY&#34;先打2次,然后打印返回值(0和0),输出变为&#34; HEYHEY00&#34;