【发布时间】:2018-01-08 03:01:15
【问题描述】:
一个面试问题在我脑海中引起了强烈的困惑,即让我们看看这个程序
#include "stdio.h"
int main()
{
static int a=25;
void cdecl conv1();
void pascal conv2();
conv1(a);
conv2(a);
return 0;
}
void cdecl conv1(int a,int b)
{
printf("%d%d", a, b);
}
void pascal conv2(int a,int b)
{
printf("\n%d%d", a, b);
}
输出是
25 0
0 25
但是为什么呢?怎么做?
你能简单解释一下吗,因为我不明白 UGC 书中提到的这个程序。
请帮助我更好地理解这个概念,以便我更好地准备面试。
感谢您宝贵的时间。
【问题讨论】:
-
您的问题不清楚。该程序不是有效的 C OR Pascal。
-
cdecl和pascal不是 C 语言的一部分,而是针对不同调用约定的编译器扩展。显然它们会影响参数传递给函数的方式。但是,当您调用具有错误参数数量的函数时会发生什么并不是很有趣。我真的不想为使用它来筛选申请人的公司工作。 -
您在 Windows 上使用 Microsoft 编译器?您应该在问题中提及平台和编译器...
-
您没有传入
b的参数有点奇怪。标准 C 没有“默认参数”支持。你看过 C 和 Pascal 的汇编调用约定吗?每种语言都可以选择如何将参数传递给函数。在将参数压入堆栈时,他们还可以选择将它们压入的顺序(从前到后,而不是从后到前)。特别是,C 将参数从后到先推送到堆栈中,我相信 Pascal 约定是从前到后的。 -
我已经删除了你的 Pascal 标签。该标签被描述为有关 Pascal 编程语言的问题,而您的问题与 Pascal 语言完全无关。请阅读标签描述而不是仅仅添加它们,因为它们听起来很合适。标签在这里具有特定的含义和相关性。谢谢。