c - printf 在 VS2013 中不使用 __cdecl

标签 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 为什么?!我对此很困惑。请问谁能帮助我?

最佳答案

在 C 中,函数参数的计算顺序是未指定的。

下面写的代码

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

可能会产生任何一个

Hello
Hi
3 6

Hi
Hello
3 6

作为输出。

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

关于c - printf 在 VS2013 中不使用 __cdecl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23357094/

相关文章:

c - 对于 10 个整数的数组,表达式 arr 和 &arr 是否相同?

更改结构内的数组大小

c++ - C/C++宏扩展

linux - 在汇编程序中打印 float

汇编中的C函数调用问题

c++ - 如何在 C/C++ 中捕获 system() 的结果

c - 为什么 strcpy() 也在复制\n?我可以摆脱它吗?

c - printf 说明符未按预期工作

c - __stdcall 名称修饰的语法是什么?

scala - Scala 可以通过引用调用吗?