请考虑以下程序并观察输出。
#include <stdio.h>
int main()
{
unsigned long long val ;
val =144111444250;
printf ("%llu\n", val);
printf ("%u %llu\n",val, val);
return 0;
}
输出:
144111444250
33 10211385600662044705
在第一个printf中使用%llu会得到正确的结果,但在第二个printf中使用%llu会得到错误的结果。
答案 0 :(得分:6)
这是未定义的行为:printf
期望unsigned int
为%u
,但您提供unsigned long long int
,无论发生什么后再发生编译器的奇思妙想。
printf
和scanf
的格式说明符不仅指示应该如何打印/扫描某些内容,还指出期望的参数类型。如果你撒谎,你不能期望结果是合理的。