【问题标题】:evaluation order and printing in printfprintf 中的评估顺序和打印
【发布时间】:2014-04-01 16:54:36
【问题描述】:

我见过有关 i++ ++i 等的问题,但我有一个小问题,有些不同。 假设我有这样的事情:

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

而P是一个函数

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

将打印什么 HEYHEY00 还是 HEY0HEY0 ?

【问题讨论】:

  • 我目前无法访问一个程序来试用它。所以我希望得到一个快速的答案,因为谷歌没有帮助我
  • 这一切都很好,但这不是 Stackoverflow 的合适问题。您可以使用许多在线编译器/IDE。试试compileonline.com
  • 我猜你的意思是printf("%d %d", p(), p());

标签: c printf


【解决方案1】:

只需运行它。

这个程序:

#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 标准确实保证参数评估的顺序,所以如果有两个函数具有不同的字符串,这些字符串的顺序不会'不可预测。

【讨论】:

  • 在这种情况下,可能无关紧要,但未指定函数参数的评估顺序。因此,如果调用了两个不同的函数,输出可能会有所不同。所以说仅仅运行程序就能告诉你它做了什么是骗人的。
  • @ShafikYaghmour:是的,但无论参数是什么(以任何顺序),都会在调用函数之前进行评估。对吗?
  • 是的,它们之前都被评估过,但是如果 OP 使用了具有不同输出的 P1()P2(),则结果将不再是可预测的。特别是因为 OP 提到 i++ ++i 的评估顺序很重要。
  • @ShafikYaghmour:已编辑。
【解决方案2】:

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

【讨论】:

  • 计算函数参数的顺序是未指定
  • 但是仅在评估后才进行打印,因此首先打印嘿,然后打印它们的返回值。那是 y 输出是 HEYHEY00
  • 我同意你的观点@dbush,但就问题而言,他问为什么输出是“heyhey0 0”。因为在打印输出之前进行的评估是“HEYHEY0 0”。
猜你喜欢
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2011-06-05
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多