C言語面接質疑応答(3)


12個のコミカルなC言語面接質問--『12個の面白いC言語質問』(3)
前のリンク:http://www.cnblogs.com/pmer/p/3322429.html
 
5,atexit with _exit
Q:次のコードでは、atexit()メソッドが呼び出されていませんが、なぜか知っていますか.  
? #include<stdio.h>
  void   func( void ) {      printf ( "
Cleanup function called
"
);      return ; }
  int   main( void ) {      int   i = 0;
       atexit (func);
       for (;i<0xffffff;i++);
       _exit(0); }
A:これは使ったからです.exit()メソッド.このメソッドでは、atexit()など、データの消去に関するメソッドは呼び出されません.
Answer: This behavior is due to the use of function _exit(). This function does not call the clean-up functions like atexit() etc. If atexit() is required to be called then exit() or ‘return’ should be used.
コメント:
このAnswerは大丈夫です.でも_exit()関数は個別コンパイラの方言にすぎない.C 99で同じ機能の関数は_Exit().
ここではatexit()を少し説明します.この関数の機能はプログラム終了時に自動的に呼び出される関数を登録することです.プログラムがexit()関数またはmain()を呼び出してrenturn文でプログラムを終了すると、atexit()で登録された関数が呼び出されて実行されます.複数の関数を登録できます.最後に呼び出される順序は、登録順序とは逆です.
と_Exit()同様にabort()関数終了プログラムを呼び出すと、atexit()に登録されている関数も呼び出されずに実行されます.
 
6,void*とC構造体
Q:任意のタイプのパラメータを受け入れて整数を返す方法を設計できますか?同時に、このようなパラメータを複数渡す方法はありますか?
A:任意のタイプのパラメータを受け入れる方法は、次のようになります.
? int   func( void   *ptr)
複数のパラメータを渡す必要がある場合は、これらのパラメータを含む構造体を渡すことができます.
Answer: A function that can accept any type of argument looks like :  int func(void *ptr)if more than one argument needs to be passed to this function then this function could be called with a structure object where-in the structure members can be populated with the arguments that need to be passed.
コメント:
「任意のタイプのパラメータ」(原文:Can you design a function that can accept any type of argument and returns an integer?  )の関数はC言語には存在しないが,この問題の要求自体はでたらめである.
後のAnswerから見ると、問題の意味は任意の種類のポインタタイプであるが、実用的な観点から言えばint func(void*ptr)という関数はほとんど意味がなく、ほとんど存在し得ない.関数は1つのvoid*タイプのパラメータを受け入れるだけで、このパラメータに対して何か実用的な操作をすることは不可能である(唯一意味のある例外はfree().理由は簡単で、void*タイプのポインタは賦値とタイプ変換の2つの演算しかありません.
そのため、void*タイプのパラメータを受け入れる関数には、通常、size_tタイプのパラメータが必ず必要です.たとえば、
void *memset(void *s, int c, size_t n);
「複数のパラメータを渡す必要がある場合は、これらのパラメータを含む構造体を渡すことができます」というと、操作性は少しもありません.
 
7,*と++オペレータ
Q:次のコードは何を出力しますか?なぜですか?
? #include<stdio.h>
  int   main( void ) {      char   *ptr = "Linux" ;      printf ( "
[%c]
"
,*ptr++);      printf ( "
[%c]
"
,*ptr);
       return   0; }
A:以上の出力は:
 
++は*の優先度と同じであるため、*ptr++は右から左に操作される.この論理によれば、ptr++は先に実行されてから*ptrが実行される.したがって、最初の結果は「L」である.++が実行されるため、次のprintf()結果は「i」である.
Answer: The output of the above would be : 
? [L]
  [i]
Since the priority of both ‘++’ and ‘*’ are same so processing of ‘*ptr++’ takes place from right to left. Going by this logic, ptr++ is evaluated first and then *ptr. So both these operations result in ‘L’. Now since a post fix ‘++’ was applied on ptr so the next printf() would print ‘i’.
 
コメント:
中国語の訳本は今回原文の中のいくつかのもの--プログラムの出力を漏らした.
Answerでは、++と*の優先度が同じではないと説明しています.接尾辞++演算子の優先度は1元*演算子より高いです.
「ptr++は先に実行してから*ptrを実行します」この解釈は同様にでたらめで、自弁することができない.ptr++を先に実行する以上、ptrはLの後ろのiを指すべきで、それから実行*ptrはiを得るべきだが、実際にはLを得るべきだ.明らかに、この推理過程に欠点があり、著者自身はいったいどういうことなのか分からない.この推理過程における欠点はいわゆる「先実行」、「後実行」であるという言い方です.
 (未完待機)
 
 
 
ラベル: 
C言語
面接