为什么我不能在我的 C 代码中使用 "long long int" 和 "int"?
Why can't I use "long long int" with "int" in my C code?
为什么我不能在我的 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
您必须在 printf 函数中使用正确的格式说明符
printf("long long int a = %lld\n int b = %d", a, b);
否则函数行为未定义。
在给定的情况下,函数似乎将压入函数堆栈的 long long int 对象的值视为参数,就像两个 int 类型的对象一样。
你可以试试这个:
printf("long long int a = %lld\n int b = %d", a, b);
%d
用来指代int
。如果你想引用 long long int
那么你必须使用 %lld
使用错误的格式说明符会导致未定义的行为打印出 long long int
的正确格式说明符是 %lld
C99标准说:
如果任何参数不是相应转换规范的正确类型,则行为未定义
a
的类型是 long long int
但你使用 %d
来打印它。
有两个可能的原因。
- 首先也是最重要的是,我没有看到你的编译器 and/or 标准库支持 C99 的证据,因此没有证据表明你的编译器 and/or 标准库支持
long long int
和相应的格式说明符 %lld
.
- 其次,关于
a
的类型,你在 printf
撒谎; %d
告诉 printf
参数是 int
类型,即使它不是(它是 long long int
)。你应该使用 %lld
...
从技术上讲,这两者都会调用未定义的行为;当你的参数不是 int
时使用 %d
是 UB,即使你正确使用 %lld
你也会在 C89 的 scanf
中使用无效的格式说明符( %lld
是 C99 格式说明符)并因此调用 UB。
您是否考虑过使用 Clang in Visual Studio?
为什么我不能在我的 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
您必须在 printf 函数中使用正确的格式说明符
printf("long long int a = %lld\n int b = %d", a, b);
否则函数行为未定义。
在给定的情况下,函数似乎将压入函数堆栈的 long long int 对象的值视为参数,就像两个 int 类型的对象一样。
你可以试试这个:
printf("long long int a = %lld\n int b = %d", a, b);
%d
用来指代int
。如果你想引用 long long int
那么你必须使用 %lld
使用错误的格式说明符会导致未定义的行为打印出 long long int
的正确格式说明符是 %lld
C99标准说:
如果任何参数不是相应转换规范的正确类型,则行为未定义
a
的类型是 long long int
但你使用 %d
来打印它。
有两个可能的原因。
- 首先也是最重要的是,我没有看到你的编译器 and/or 标准库支持 C99 的证据,因此没有证据表明你的编译器 and/or 标准库支持
long long int
和相应的格式说明符%lld
. - 其次,关于
a
的类型,你在printf
撒谎;%d
告诉printf
参数是int
类型,即使它不是(它是long long int
)。你应该使用%lld
...
从技术上讲,这两者都会调用未定义的行为;当你的参数不是 int
时使用 %d
是 UB,即使你正确使用 %lld
你也会在 C89 的 scanf
中使用无效的格式说明符( %lld
是 C99 格式说明符)并因此调用 UB。
您是否考虑过使用 Clang in Visual Studio?