web-dev-qa-db-ja.com

「&&」と「and」演算子の違い

Cppreferenceを参照すると、 代替演算子andornotなど)が表示されました。

これらは、&&||!などの「通常の」演算子の代替です。

&&andを使用するコードのアセンブリを調べました。両方のバージョンで同じアセンブリが生成されました。

コード:

#include <iostream> 

int n = 1;
int main()
{
// if(n > 0 && n < 5)
   if(n > 0 and n < 5)
   {
       std::cout << "n is small and positive\n";
   }
}

だから私の質問は:

  • &&演算子とand演算子の違いは何ですか?
  • いつどこでand&&よりも使用しますか?
  • 違いがない場合、C++はなぜ代替演算子(andornotなど)を導入するのですか?
12
msc

&&とand演算子の違いは何ですか?

なにもない1。これらの演算子の「代替」の側面は、それらを使用して、意味論の観点からまったく同じ式を構築できることを意味します。

&&はどこでいつ使用しますか?

これは主に好みの問題です。私は&&に慣れすぎて使用していませんが、誰かがandをもっと読みやすいと感じれば理解できます。

なぜC++は代替演算子を導入するのですか?

C++は、さまざまな文字セットとプラットフォームで使用できるように設計されています。バトシェバが指摘したように、トリグラフもそのような特徴の別の例です。文字セットが&&の書き込みを許可しない場合(たとえば、単に&文字がなかったため)、それでも代替表現を使用することができます。今日では、それは大部分が議論の余地があります。


1 実際、さらに考えると、あなたの最初の質問に対する私の答えは洗練されます。トークンの解析方法に関連して、同等性がわずかに不足しています。 &&では、スペースを個別のトークンとして解析する必要はありませんが、andでは必要です。つまり:

void foo(bool b1, bool b2) {
  if(b1&&b2) { // Well formed
  }

  if(b1andb2) { // ill formed, needs spaces around `and`
 }
}
15
StoryTeller

andornot、&c。 代替演算子の例です。

完全なリストについては http://en.cppreference.com/w/cpp/language/operator_alternative を参照してください。冒頭の段落は存在理由

C++(およびC)のソースコードは、ISO 646:1983不変文字セットを含む非ASCII 7ビット文字セットで記述できます。ただし、いくつかのC++演算子と句読点には、ISO 646コードセット外の文字が必要です:{、}、[、]、#、\、^、|、〜。これらの記号の一部またはすべてが存在しない文字エンコード(ドイツ語DIN 66003)など)を使用できるようにするために、C++はISO 646互換文字で構成される次の代替を定義します。

私があなただったら、私がそれらを使用することをためらうでしょう。後者がインタビューを面白くするものであったとしても、あなたがダイグラフとトリグラフを使用することから遠ざかるべきであるのと同じように。

たとえば、トリグラフはC++ 17から明示的に廃止されました。 and&cが表示される場合があります。将来の標準でも削除されます。

10
Bathsheba