为什么我不能在我的C代码中使用“long long int”和“int”?
int main(void) {
long long int a;
int b;
a = 1000000000;
b = 3200;
printf("long long int a = %d\n int b = %d", a, b);
return 0;
}
long long int a = 1000000000
int b = 0
答案 0 :(得分:2)
您必须在printf函数中使用正确的格式说明符
printf("long long int a = %lld\n int b = %d", a, b);
否则函数行为未定义。
在给定的情况下,函数似乎将在函数堆栈上推送的long long int对象的值视为一个参数,就像两个int类型的对象一样。
答案 1 :(得分:2)
你可以试试这个:
printf("long long int a = %lld\n int b = %d", a, b);
%d
用于引用int
。如果您想引用long long int
,则必须使用%lld
答案 2 :(得分:2)
使用错误的格式说明符会导致未定义的行为,打印出long long int
的正确格式说明符为%lld
答案 3 :(得分:1)
C99标准说:
如果任何参数不是相应转换规范的正确类型,则行为未定义
a
的类型为long long int
,但您使用%d
进行打印。
答案 4 :(得分:0)
有两个可能的原因。
long long int
以及相应的格式说明符{{1} }。%lld
对printf
的类型撒谎; a
告诉%d
该参数的类型为printf
,即使它不是(int
)。您应该使用long long int
... 从技术上讲,这两种方法都会调用未定义的行为;当您的参数不是%lld
时使用%d
是UB,即使您正确使用int
,您也会在C89的%lld
中使用无效的格式说明符( scanf
是C99格式说明符)并因此调用UB。
您是否考虑过使用Clang in Visual Studio?