[解決済み] C言語の論理ANDはなぜ短絡的な動作をしないのですか?
質問
これは宿題のようなものですが、私はこのトピックについて調べ、かなり深く考えましたが、これを理解することができません。質問は、コードのこの部分が表示されないと述べている 短絡的な動作 と書いてあり、その理由を尋ねています。しかし、私にはこれが短絡的な動作を示すように見えるのですが、なぜそうならないのか、どなたか説明していただけないでしょうか。
C言語では
int sc_and(int a, int b) {
return a ? b : 0;
}
の場合は
a
が偽の場合、プログラムは
b
を評価しようとしないが、私は間違っているに違いない。なぜプログラムは
b
に触れる必要がないのでしょうか?
どのように解決するのですか?
これはひっかけ問題です。
b
は入力引数で
sc_and
メソッドへの入力引数であり、したがって常に評価されます。言い換えれば
sc_and(a(), b())
は
a()
を呼び出し
b()
(を呼び出し(順番は保証されません)、次に
sc_and
の結果で
a(), b()
に渡されます。
a?b:0
. これは三項演算子自体とは関係なく、絶対に短絡してしまいます。
UPDATE
私がこれを「トリッククエスチョン」と呼んだ理由に関して。それは、(少なくともOPによって再現されるように)「短絡」を考慮するためのコンテキストが明確に定義されていないためです。多くの人が、関数の定義だけを与えられても について質問しているのだと思い込んでしまいます。 ボディ 関数の 彼らはしばしば、関数をそれ自体として式として考えていないのです。これは質問の「トリック」です。一般的なプログラミング、特にC言語のようなルールに多くの例外がある言語では、そのようなことはできないことを思い出させるためです。例:このような質問をされた場合。
次のようなコードを考えてみましょう。から呼び出されたとき、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
を使うことになります。)
三項演算子自体が行うことを短絡的と呼ぶかどうか(あるいは「条件付き評価」のような他の何か)は、短絡的の定義に依存しますし、それについての考えについてはさまざまなコメントを読むことができます。私の場合はそうですが、それは実際の質問や私がそれを「トリック」と呼んだ理由にはあまり関係ありません。
関連
-
[解決済み] PTHREAD_MUTEX_INITIALIZER vs pthread_mutex_init ( &mutex, param )
-
[解決済み] C 言語で const char* を char* に変換するには?
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み】なぜこれらのコンストラクトはプリインクリメントとポストインクリメントを使用して未定義の動作をしているのでしょうか?
-
[解決済み】このC関数は常にfalseを返すべきですが、そうではありません。
-
[解決済み] 論理演算子の短絡は必須ですか?また、評価順序は?
-
[解決済み] オーバーロードされた && と || がショートしないのは、実は理由があるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
g++が内部・外部コマンドソリューションとして認識されない、MinGWを初めて使うときの落とし穴
-
赤線の位置は必ずしも間違っていない:式は変更可能なlvalueでなければならないエラーは、この文とは別の場所に存在する可能性があります。
-
C/C++の再定義
-
[解決済み] munmap_chunk(): 無効なポインタ
-
[解決済み] C言語で関数をパラメータとして渡すにはどうすればよいですか?
-
[解決済み] C言語でランダムなint型を生成するには?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] longをフォーマットするprintfの引数は何ですか?
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消