C/ c++中的参数传递

Parameter passing in C/C++

本文关键字:参数传递 c++      更新时间:2023-10-16

我有两个问题。

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;
}

对于Q1:经验法则是All the Default parameters应该在右边,而func(int a = 1, int b, int c)因为a =1而违反了这个规则。它会显示错误,因为如果我们写func(5,6),编译器不会理解5将被赋值给ab。当调用函数时,参数从左到右方向分配。这是基本的基础。

对于func(int a = 1, int b, int c = 3)同样,如果调用func(7),编译器会尝试将7赋值给a,但b没有赋值。这也会导致错误

这是对Q3的回答。

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

当您看到正确的代码时,这一切都变得更加清晰。因为要传递long long参数,所以需要指定正确的长度子说明符(在本例中为"ll"):
printf("a = %lld, b = %lld, c = %lld.n", a, b, c);

注意"ll"告诉printf参数有多大,在你的例子中,它们是你传递的计划"%d"的两倍(在大多数当前硬件上)。