查看以下在 visual studio 2012 中编译的代码。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
long long end1 = 12345678908642;
long end2 = 65537;
printf("end1 = %lld and %u\n" , end1 , end1); // line a
printf("end2 = %d and %ld and %u\n" , end2 , end2 , end2); // line b
printf("end2 = %d and %ld and %lld and %u\n" , end2 , end2 , end2 , end2); // line c
system("pause");
return 0;
}
Q1:我以为在a行,%lld和%u显示的两个数字是一样的,其实不一样,但为什么在b行,%u显示的是正确的数字?
Q2:在c行,%lld和%u显示的数字不对,为什么?我认为它们应该像 %d 和 %ld 一样。
我很困惑。
最佳答案
转换说明符(如 %u)必须匹配作为参数给出的相应值的类型。
printf 使用可变参数列表。整数提升后,实际参数被压入函数堆栈,但被调用者不知道每个实际参数的偏移量 (printf);这些偏移量是从格式字符串中重建的。
因此,如果您认为所有实际参数首先由调用者连接并由具有不同偏移量的被调用者 (printf) 读取(根据转换说明符,这与实参)。
关于对 C 中 %d 和 %ld 以及 %lld 和 %u 的边界感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31856361/