これはトリックの質問です。b
はsc_and
メソッドへの入力引数であるため、常に評価されます。他の語でsc_and(a(), b())
呼ぶa()
とコールb()
(保証されないため)、その後、呼び出しsc_and
の結果とa(), b()
に渡されますa?b:0
。絶対に短絡する三項演算子自体とは何の関係もありません。
更新
私がこれを「トリック質問」と呼んだ理由に関して:それは、「短絡」をどこで考慮するかについて明確に定義されたコンテキストがないためです(少なくともOPによって再現されたように)。多くの人は、関数の定義だけが与えられた場合、質問のコンテキストが関数の本体について尋ねていると想定します。多くの場合、関数をそれ自体の式とは見なしません。これが質問の「トリック」です。プログラミング全般では、特にルールに多くの例外があるCライクのような言語では、それを行うことはできません。例、質問がそのように尋ねられた場合:
次のコードについて考えてみます。呼び出されたときにexibit短絡動作をsc_andますメイン:
int sc_and(int a, int b){
return a?b:0;
}
int a(){
cout<<"called a!"<<endl;
return 0;
}
int b(){
cout<<"called b!"<<endl;
return 1;
}
int main(char* argc, char** argv){
int x = sc_and(a(), b());
return 0;
}
あなたがの思考することになっていることがすぐに明らかであるsc_and
中、自分の中に自身のオペレータとしてドメイン固有言語、および場合の評価への呼び出しsc_and
定期的に同様の展示短絡動作が&&
でしょう。三項演算子に焦点を当てるのではなく、代わりにC / C ++の関数呼び出しメカニズムに焦点を当てる必要があることは明らかであるため、これをトリックの質問とはまったく見なしません(そして、おそらくリードします)関数ではなくsc_and
を使用することを含む、短絡を行うを書くためのフォローアップの質問にうまく入り#define
ます)。
三項演算子自体が短絡(または「条件付き評価」など)を行うことを呼び出すかどうかは、短絡の定義に依存し、それについての考えについてはさまざまなコメントを読むことができます。私の場合はそうですが、実際の質問や、なぜそれを「トリック」と呼んだのかとはあまり関係がありません。