为什么我不能在我的 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