2013-02-09 42 views
-4

所以,这里是我的问题,给出这个代码,几乎任何东西添加之前请输入您的名字被忽略,并自动运行的第一个指令(甚至没有首先检查是否x是5,输入你的名字,然后在它之前的指令运行,所以如果程序的第一行是一个printf,它将被忽略,并立即要求输入,然后打印printf语句,即使它是第一个。请帮助c系统调用在if语句之前运行

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

3不大于5。 – 2013-02-09 02:16:01

回答

1

printf的工作在stdout这是一个FILE *的read()和write()调用直接文件描述符工作。

一个FILE *通常是缓冲,这意味着东西,你的printf驻留在你的程序中的缓冲区,直到它被刷新。虽然write()将数据直接发送到操作系统,但在应用程序中没有任何缓冲。

因此刷新文件*缓冲区,使输出显示:

int main(int argc, char** argv) 
{ 
    char val[70]; 
    int x=3; 
    printf("Hello"); 
    fflush(stdout); 

如果stdout是你的终端,它通常是自动当你写一个换行符通红,例如printf("Hello\n");

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 

也许是一个很好的时间FO让你学习如何调试你的代码。首先阅读一些GDB documentation

祝你好运!