0

我在这里有两个问题。

Q1:以下程序输出什么(在 32 位 little-endian 机器上):

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

为什么?

Q2:

为什么 和 的输出a不同?bc

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

2 回答 2

0

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

类似地,func(int a = 1, int b, int c = 3)如果我们调用 func(7),编译器会尝试分配7a,但对于 没有任何东西b。所以这也会导致错误。

于 2013-05-06T05:03:28.990 回答
0

这仅是对 Q3 的回答。

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

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

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

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

于 2013-05-06T05:04:58.583 回答