-4

したがって、ここに私の問題があります。このコードを考えると、あなたの名前を入力してくださいの前に追加されたものはすべて無視され、実行される最初の命令が自動的に実行されます(最初に 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)
        {}
    }
}
4

2 に答える 2

1

あなたが言っていることは何が起こるかではありません。main関数はすぐに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ドキュメントを読むことから始めます。

幸運を!

于 2013-02-09T02:20:33.953 に答える
1

printfstdoutは FILE* で動作します。read() および write() 呼び出しは、ファイル記述子に対して直接機能します。

FILE* は通常バッファリングされます。つまり、printf した内容は、フラッシュされるまでプログラム内のバッファに存在します。一方、write() は、アプリケーションでのバッファリングなしで、データをオペレーティング システムに直接送信します。

したがって、FILE* バッファーをフラッシュして、出力を表示させます。

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

また、stdout が端末の場合、改行を書き込むと通常は自動フラッシュされます。 printf("Hello\n");

于 2013-02-09T02:16:49.873 に答える