所以这是我的问题,鉴于此代码,只是在输入您的名字之前添加的任何内容被忽略,并自动运行第一条指令(甚至没有先检查x是否为5,输入您的名字,然后它之前的指令是运行的。所以如果程序的第一行是printf,那将被忽略并立即询问输入然后打印printf语句,即使它是第一行。请帮助
int main(int argc, char** argv)
{
char val[70];
int x=3;
if(x>5)
{
if(write(1, "Please input your name", 22)!=22)
{
return -1;
}
if(read(0, val, 36) < 0)
{}
if(write(1, val, 36)!=36)
{}
}
}
答案 0 :(得分:1)
printf适用于stdout
这是一个FILE *。 read()和write()调用直接在文件描述符上工作。
FILE *通常是缓冲的,这意味着你打印的东西会驻留在程序的缓冲区中,直到它被刷新为止。 write()将数据直接发送到操作系统,而不会在应用程序中进行任何缓冲。
然后刷新FILE *缓冲区以显示输出:
int main(int argc, char** argv)
{
char val[70];
int x=3;
printf("Hello");
fflush(stdout);
如果stdout是你的终端,那么当你写一个换行符时,通常会自动刷新,例如printf("Hello\n");
答案 1 :(得分:1)
你所说的不是会发生什么。您的主函数将立即返回0.以下是调试示例:
(gdb) break main
Breakpoint 1 at 0x40074b: file ./test.cpp, line 6.
(gdb) run
Starting program: /tmp/test
Breakpoint 1, main (argc=1, argv=0x7fffffffe528) at ./test.cpp:6
6 int x=3;
Missing separate debuginfos, use: debuginfo-install glibc-2.16-28.fc18.x86_64 libgcc-4.7.2-8.fc18.x86_64 libstdc++-4.7.2-8.fc18.x86_64
(gdb) next
7 if(x>5)
(gdb)
19 }
(gdb)
0x00007ffff7744a05 in __libc_start_main () from /lib64/libc.so.6
(gdb)
Single stepping until exit from function __libc_start_main,
which has no line number information.
[Inferior 1 (process 4962) exited normally]
(gdb)
事实上,在启用优化的情况下,对其主体的整个if
检查将作为死代码消除,从而产生一个很好的主函数,如下所示:
int main()
{
return 0;
}
通过查看二进制代码(objdump -CD -M intel
)确认:
00000000004004c0 <main>:
4004c0: 31 c0 xor eax,eax
4004c2: c3 ret
4004c3: 90 nop
也许现在是学习如何调试代码的好时机。首先阅读一些GDB documentation。
祝你好运!