我有这个示例代码:
#include#include 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在获取之前,但是当我运行代码时,它会在打印数字后首先询问字符串.我正在使用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); }
编译器可以计算任意a
或b
以任何顺序(线1或2号线),因为它不会影响代码的行为.或者它甚至可以简单地用以下函数替换函数:
void func(void) { printf("%d\n", 10); }
通常,编译器会进行此类转换以进行优化,并且是允许的.在您的代码中,编译器不能执行此类代码转换,因为它会影响代码的可观察行为.