不打印在VS2013中使用__cdecl

时间:2014-04-29 06:27:51

标签: c printf calling-convention cdecl

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

#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 为什么?!我很困惑。请问我能帮助我吗?

1 个答案:

答案 0 :(得分:1)

在C中,函数参数的评估顺序未指定。

下面的代码

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

可能会产生

Hello
Hi
3 6

Hi
Hello
3 6

作为输出。

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