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


94

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

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


4
\ me彼のコードをすべて書き換えます
限定的な償い

2
「クリーンなコード」の精神で、私は個人的には、||および&&場合によっては、書くことの習慣をなくすことをお勧めします!。単語は常に「ラインノイズ」よりも優れており、ビット操作演算子との混乱の可能性は言うまでもありません。
Ichthyo 2016年

2
@Ichthyo常に正しいとは限りません。たくさんの単語を読むよりも、たくさんの記号を読んでそれらの意味を知る方がはるかに速いです。
バレンティン

人間の読者にとってより明確なものは、「ゲシュタルト」に依存しています。シンボルは混乱した用語よりも明確な場合がありますが、この場合はそうではありません。そして、英語の単純な単語は、やや奇妙なプログラミング言語のいくつかの奇妙な特殊記号よりもはるかに普遍的です...
Ichthyo

3
それandはもっと読みやすいと言ってから「and&& or」と書く皮肉なことですが:)
Ivan Vergiliev '

回答:


111

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

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

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

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


それでは、これらの代替トークンの解釈は単なるコンパイラ機能ですか、それともC ++仕様にあるのですか?
不良

2
@Kavon:標準のセクション2.5で指定されています。それは言語機能です。
GManNickG 2010年

15
私は個人的にそれらははるかに優れていると思います...しかし、私はPythonに偏っています。一部の人々が文字化けしていないとコードではないことをなぜ言うのか分かりません...
Matthieu M.

したがって、これらはそのヘッダーファイルをインクルードせずにCでは無効ですか?これらが誰もが使用しているわけではないことに驚いています。Pythonをとても読みやすくします。
内部石

1
少なくともVisual Studio 2015 CTP 6は、ヘッダーが含まれていない、orまたはnot含まれていないのが嫌いでした。
usr1234567 2015年

18

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


4
残念ながら、Visual Studio(VS2013以降)では/Za、代替キーワードをサポートするために特定のコンパイラオプション()を設定する必要があります(stackoverflow.com/a/555524/368896を参照)。それはおそらく他の影響も持っています。したがって、Visual Studioでは、このアドバイスを受け入れることが必ずしも安全ではありません。
Dan Nissenbaum、2014年

FWIW /-演算子の周りにスペースを置くと、x | y(等幅フォントでは)とは視覚的に十分に区別されx || yますが!、たとえばはif (!f(xyz) && ...見落としがちですif (not f(xyz) && ...
Tony Delroy、

@Tony D演算子の周りにスペースを置くと、それはあなたの私的な慣習であり、読者には明らかではありません。しかしand、のような自然言語の単語ornotブール式を使用すると、実際に読みやすさが向上し、ビット操作の違いが強調されます。したがって、私たちは私たちの愛する古い習慣をより良いものに変えることを考慮すべきです...
Ichthyo

@DanNissenbaumこのオプションはC / C ++>言語>言語拡張を無効にするという名前で見つけたので、副作用を予期しても比較的安全です;)
Wolf

6
単語andorバイアスがどのように機能するかについて人々の考えが偏っているので、Pythonのバグがいくつ導入されたか知っていますか?たとえば、if (a == b or c)代わりにif (a == b || a == c)-このようなものが、ここStackOverflowでほぼ毎日表示されます。英語から切り離された抽象記号は、これらのエラーを減らします。
Mark Ransom 2017

10

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


6
技術的には、キーワードではなく代替トークンです。:)
GManNickG 2010年

2
@GMan:+1いい電話ですが、Dinkumwareページではキーワードと呼ばれているので、区別についてあまり気にしていなかったと思います。
Chris Jester-Young


では、MSVCはC ++でそのままサポートしますが、Cではサポートしませんか?
2015年

1
@rwst MSVCについて具体的にコメントすることはできませんが、C ++とCの標準を忠実に実装している場合は、実際にそうなります。参照:stackoverflow.com/questions/2376448/...
クリス・ジェスター・ヤング

2

andおよび&&C ++で機能的に同じです。andそしてor、オペレータは、真に有効なC ++言語の標準の一部です。

具体的な例と他の回答について詳しく説明するには、好むだけの「読みやすさ」のほかに、別の理由があるand以上&&。論理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」の文字を誤って省略して、何が起こるかを確認してください。;)


1
これは実際には質問に対する答えではありません。それはあなたがより読みやすいと感じるものを述べるだけです。OPは、記述されたバージョンがどのように機能するかについて尋ねましたが、どちらが優れているのかではありません。そして、他の誰かがあなたがしようとしているのと同じ点をすでに作りました。
Nicol Bolas

ではない、それは本当にすべてのより多くの有用な情報を提供していますが、私は追加「だろうことand&&機能的に同じです」その答えに...そして、あなたは私の答えを読めば、あなたが、私はそのこと読みやすさについて言っていることを参照してくださいね;)
tjwrona1992
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.