参数传递C / C ++

时间:2013-05-06 04:42:43

标签: c++ c parameter-passing optional-parameters

我在这里有两个问题。

Q1: 以下程序将输出什么(在32位小端机器上):

int main()
{
    long long a = 0x1, b = 0x2, c = 0x3;
    printf("a = %d, b = %d, c = %d.\n", a, b, c);
    return 0;
}

为什么?

Q2:

为什么abc的输出有所不同?

void func(int a, int b, int c)
{
    printf("a = %d, b = %d, c = %d.\n", a, b, c);
}
int main()
{
    long long a = 0x1, b = 0x2, c = 0x3;
    printf("a = %d, b = %d, c = %d.\n", a, b, c);
    func(a, b, c);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

对于Q1:由于拇指规则是所有默认的Pramaeters应该在右侧,func(int a = 1, int b, int c)因为a = 1而使规则消失。它将显示错误,因为如果我们编写func(5,6),编译器将无法理解5将被分配给ab。在调用函数时,参数从左到右分配。这是基本的基础。

如果我们调用func(7),func(int a = 1, int b, int c = 3)的格式似乎是,编译器会尝试将7分配给a,但b没有任何内容。所以这也会导致和错误。

答案 1 :(得分:0)

这只是对Q3的回答。

简单的答案是printf不是类型安全的。解析格式字符串,并根据遇到的说明符,printf函数从变量参数列表中提取适当大小的数据。

当您看到正确的代码时,这一切都变得更加清晰。因为您要传递long long个参数,所以需要指定正确的长度子说明符(在本例中为“ll”):

printf("a = %lld, b = %lld, c = %lld.\n", a, b, c);

注意“ll”告诉printf参数有多大,在你的情况下,它们是你传递的计划“%d”的两倍(在大多数当前硬件上)。