2014-04-29 33 views
1

今天在我的采访中有一个这样的问题。不打印在VS2013中使用__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上运行它。 IT SHOWED 5,2 !!!!!

现在,我回到家,再次尝试ideone.THE ANSWER是5,1 !!! http://ideone.com/sq6yRE 为什么?我很困惑,请帮我一下?

+3

调用约定并不意味着有关的论点*评估*,只是它们是* *通过对订单的订货任何东西。 –

+0

[请参阅此处](http://stackoverflow.com/a/8785539/2065121)进行类似的讨论。 –

+1

不要为这家公司工作。显然,他们会给你未指定的任务,以工作... – fritzone

回答

1

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

代码写入下面

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

会产生任一

Hello 
Hi 
3 6 

Hi 
Hello 
3 6 

作为输出。

而且无论是你还是你的面试官要问为什么,怎么等

+0

谢谢,我明白了。 C99 6.5.2.2函数调用 10.函数指示符的评估顺序,实际参数以及实际参数中的子表达式未被指定,但在实际调用之前有一个顺序点。 –

相关问题