【问题标题】:Doesn't printf use __cdecl in VS2013VS2013 中 printf 不使用 __cdecl
【发布时间】:2014-04-29 06:27:50
【问题描述】:

我今天的采访中有这样一个问题。

#include <stdio.h>

int main(void) 
{
    char *s="123456790";
    printf("%c,%c",*(char *)((int *)s+++1),*s);
    return 0;
}

我的答案是 5,1,但面试官说是 5,2! 当然,我知道 C 中默认的调用约定是 __cdecl,参数传递的顺序是从右到左,所以我把这件事告诉了他。但他不相信。比我们在 VS2013 上运行它。 显示为 5,2!!!!

现在,我回到家在 ideone 上再试一次。答案是 5,1! http://ideone.com/sq6yRE 为什么?!我对此感到很困惑。请问谁能帮助我?

【问题讨论】:

标签: c printf calling-convention cdecl


【解决方案1】:

在 C 中,函数参数的求值顺序是未指定的。

下面写的代码

int main()
{
  printf("%d %d\n", printf("Hi\n"), printf("Hello\n"));
  return 0;
}

可能产生任何一种

Hello
Hi
3 6

Hi
Hello
3 6

作为输出。

你和你的面试官都不应该质疑为什么,如何等等。

【讨论】:

  • 谢谢,我明白了,现在。 C99 6.5.2.2 函数调用 10.函数指示符、实际参数和实际参数中的子表达式的求值顺序未指定,但在实际调用之前有一个顺序点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
相关资源
最近更新 更多