web-dev-qa-db-ja.com

論理演算子の記述バージョン

これ は、C++で実際の演算子としてリストされているandornotを私が今まで見た中で唯一の場所です。 NetBeansでテストプログラムを作成したとき、構文エラーがあるかのように赤い下線が引かれ、Webサイトが間違っていることがわかりましたが、期待どおりにコンパイルおよび実行されたため、NetBeansは間違っています。

私は見えます !notよりも好まれていますが、and && orの読みやすさは、文法上の兄弟よりも優れているようです。なぜこれらのバージョンの論理演算子が存在し、なぜだれもそれを使用していないように見えるのですか?これは本当に有効なC++ですか、それとも言語に含まれていたCとの互換性ですか?

91
defectivehalt

それらはCのヘッダー <iso646.h> で始まりました。当時、(たとえば)&&に必要な記号を入力できないキーボードがあったため、ヘッダーには#defineが含まれており、(この例では)and&&になります。もちろん、時間が経つにつれ、これはあまり使われなくなりました。

C++では、代替トークンと呼ばれるものになりました。 notは、これらのトークンを準拠コンパイラで使用するために何かを含める必要があります(そのため、CヘッダーのC++で変更されたバージョン、<ciso646>、空白です)。代替トークンは、スペルを除いて通常のトークンと同じです。したがって、解析中のand&&exactlyと同じですが、同じものを綴る方法が異なります。

それらの使用について:それらはめったに使用されないので、それらを使用することは多くの場合、役立つよりも意外で混乱します。普通なら読みやすくなると思いますが、人々は&&に慣れており、||に慣れていると、気が散るだけです。

編集:ただし、これを投稿して以来、使用量が非常にわずかに増加しています。私はまだそれらを避けます。

103
GManNickG

それらは、使いやすさ(キーボード/ディスプレイフレーバーでの文字サポート)と一般的な読みやすさのために存在しますが、今日より顕著になっている別の理由があります。ほとんどの回答 ここここ 、または主要な回答 ここ でも、私たちの多くがWordバージョンよりもWordバージョンを好む主な理由を詳しく説明していますシンボルバージョン(および他の言語がそれらを使用する主な理由):バグ。 Wordのバージョン間の違いは非常にはっきりしています。シンボルバージョン間の違いは著しく少なく、バグを比較的はるかに誘惑するほどです。「x | y」は「x || y」ではありませんが、より大きな式に埋め込まれた場合、違いを見逃してください。これは、代入演算子と等値演算子の一般的な偶発的な混合に似ています。このため、私はシンボルバージョンから脱却しました(簡単ではありませんでした)ので、Wordバージョンを優先しました。バグを誘惑するよりも古いものを私たちが愛しているので、私は誰かにそれらをダブルテイクしてもらいたいです。

17
mr3

C++では、これらは実際のキーワードです。 Cでは、これらは<iso646.h>で定義されたマクロです。 http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html を参照してください。

10

andおよび&&はC++でも機能的に同じです。 andおよびor演算子は本当に有効なC++であり、言語標準の一部です。

具体的な例で他の回答を詳しく説明するには、単なる「読みやすさ」以外に、andを優先する理由がもう1つあります&&。論理ANDであるときに「and」を明示的にスペルアウトすると、微妙なバグの可能性が排除されます。

これを検討してください:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

3つのifステートメントはすべてコンパイルされますが、最後のステートメントはまったく異なる意図しないものを意味します。

論理ANDを意味するときに常にandを使用する場合は、誤って単一の「&」を入力してコードを正常にコンパイルし、不思議な結果で実行することはできません。

もう1つの優れた演習:「and」の文字を誤って省略して、何が起こるかを確認してください。 ;)

2
tjwrona1992