我在这里有两个问题。
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:
为什么a
,b
和c
的输出有所不同?
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;
}
答案 0 :(得分:0)
对于Q1:由于拇指规则是所有默认的Pramaeters应该在右侧,func(int a = 1, int b, int c)
因为a = 1而使规则消失。它将显示错误,因为如果我们编写func(5,6),编译器将无法理解5将被分配给a
或b
。在调用函数时,参数从左到右分配。这是基本的基础。
如果我们调用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”的两倍(在大多数当前硬件上)。