Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我不能在我的C代码中使用“long-long-int”和“int”?_C_Visual Studio 2012 - Fatal编程技术网

为什么我不能在我的C代码中使用“long-long-int”和“int”?

为什么我不能在我的C代码中使用“long-long-int”和“int”?,c,visual-studio-2012,C,Visual Studio 2012,为什么我不能在我的C代码中使用长整型和整型 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; } 长整型a=100000000 int b=0 您必须在printf函数中使用正确的格式说明符 printf("long long int a =

为什么我不能在我的C代码中使用长整型和整型

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;
}
长整型a=100000000

int b=0


您必须在printf函数中使用正确的格式说明符

printf("long long int a = %lld\n int b = %d", a, b);
否则,函数行为未定义

似乎在给定的情况下,函数将推送到函数堆栈上的long int对象的值视为一个参数,就像两个int类型的对象一样。

您可以尝试以下方法:

printf("long long int a = %lld\n int b = %d", a, b);

%d用于表示整型。如果要表示长整型,则必须使用%lld。使用错误的格式说明符会导致未定义的行为。打印长整型的正确格式说明符是%lld。C99标准规定: 如果任何参数不是相应转换规范的正确类型,则行为未定义
a的类型是long-long-int,但您可以使用%d打印它。

可能有两个原因

首先也是最重要的一点,我没有看到任何证据表明您的编译器和/或标准库支持C99,因此也没有证据表明您的编译器和/或标准库支持long-long-int和相应的格式说明符%lld。 第二,关于a的类型,你在对printf撒谎;%d告诉printf参数的类型为int,即使它不是long-long-int。您应该使用%lld。。。 从技术上讲,这两者都会引发未定义的行为;当参数不是int时使用%d是UB,即使正确使用了%lld,也会在C89的scanf中使用无效的格式说明符%lld是C99格式说明符,因此会调用UB


您考虑过使用吗?

%d表示常规int,而不是long-long。嗯,我认为VS可能使用不同的说明符。请参阅投票结束,因为答案可能在大多数C编程书籍的第1章中找到。printf是一个vararg函数..->变量参数。它将使用格式说明符来解释/理解传递给它的参数。如果指定%d,但传递一个长整型,结果将是未定义的行为visual studio-2012是否遵循C99?@chux部分…我只想说,在编写代码时,我们应该尽量避免可能导致错误的内容。@chux visual studio不遵循任何标准,尤其是所有C标准。甚至称它为C编译器都是有问题的。@Lundin:VS确实有一个兼容C89的编译器,但他们从来没有费心去实现C99标准。VS确实实现了一些C99的可变宏功能,长如C89的超集,但他们没有实现VLA和like@Lundin:一如既往,MS在整个过程中添加了一些功能和更安全的替代方案,但好吧,从理论上讲,使用VS编译标准C89是可能的,尽管可能会更简单、更快,总之,最好使用不同的编译器:-对于这个特定的、完全相同的问题,PI必须停止计算有多少个重复,因为我从计算它们中得到了一个整数溢出@Rizier123使用long-long来计算它们。@Rizier123如果你找到一个好的副本,请用链接对这个问题发表评论,我们可以立即将其作为副本关闭。