编译器颠倒了 C 行顺序?

标签 c stdio

我有这个示例代码:

#include <stdio.h>
#include <stdlib.h>

int addOne();

int main(int argc, char** argv) {
    char s[100];
    int x = 1;
    x = addOne(x);
    printf("%d",x);
    gets(s);
    return (EXIT_SUCCESS);
}

int addOne(int j) {
    return j + 1;
}

您可以看到 printf 在 gets(s) 之前,但是当我运行代码时,它先询问字符串,然后再打印数字。我将 NetBeans 与 Cygwin gcc 编译器一起使用。有什么我想念的吗?是编译器错误吗?

最佳答案

printf() 通常是行缓冲的。因此,在刷新缓冲区之前,printf 的输出不会出现在屏幕上。

\n 添加到 printf,它应该会按预期工作。

printf("%d\n",x);

如果不需要,您可以使用 setbuf(stdout, NULL); 禁用缓冲。

顺便说一句,你永远不应该gets()。请改用 fgets()。因为 gets() 容易出现缓冲区溢出漏洞,自 C99 以来已被废弃,并已从 C11 中完全删除。


关于您怀疑编译器正在对行重新排序:编译器确实可以重新排序指令并且被允许合法地这样做。 但前提是它不影响程序的可观察效果

考虑以下代码,

void func(void)
{
   int a = 2;
   int b = 3;

   a = a * 2;  //line 1
   b = b + 3;  //line 2

   printf("%d\n", a+b);
}

编译器可以按任何顺序(第 1 行或第 2 行)计算 ab,因为它不会影响代码的行为。或者它甚至可以简单地将函数替换为:

void func(void)
{
   printf("%d\n", 10);
}

通常,编译器会出于优化目的进行此类转换,并且是允许的。在您的代码中,编译器无法执行此类代码转换,因为它会影响代码的可观察行为。

关于编译器颠倒了 C 行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34066225/

相关文章:

c - sizeof(array_of_char) 输出奇怪的数字

python - 在两个Python模块之间传递C函数指针

ruby - 如何将 STDOUT 捕获到字符串?

c - 修改保证在 C 中连续调用 ungetc() 两次的 fflush()

c - `getchar()` 返回错误的具体情况是什么?

node.js - 使用 node.js 获取正在运行的进程的标准输入/标准输出

c - 如何在C中读取/解析输入?常见问题

c - 函数中的操作数组 - c - 段错误

c - 如何更改作为参数传递的变量的值?

c - Getopt - 为缺少的选项和缺少的非选项参数添加大小写