6

現在、このチュートリアルを使用してC++をチェックアウトしています。演算子とは何かを説明してい! NOTますが、なぜ使いたいのかよくわからないと思います。誰か説明してもらえますか?

4

12 に答える 12

13

この!演算子は、条件が現在満たされていないことを確認する場合に役立ちます。

アプリケーションの特定のサブシステムが初期化されたかどうかを通知する関数と、それを初期化する別の関数を想像してみてください。

bool subsystem_is_initialized();
void subsystem_initialize();

初期化されていることを確認し、not演算子を使用していない場合は初期化できます。

if (!subsystem_is_initialized())
    subsystem_initialize();

すべての実用的な目的で、値をゼロと比較するより短い方法であり、影響を受ける値がブール値であることが明示的に示唆されています。絶対に必要というわけではありませんが、乗算(加算をループできます)、加算(バイナリロジックで実行できます)、またはほとんどのバイナリロジック(ほとんど何でも実行できます)も必要ありません。 NAND、私は言われましたが、私はそれを自分で研究していません)。

また、他のほとんどすべてのC ++演算子と同様に、クラスによってオーバーロードされる可能性があることにも注意してください。

于 2013-03-25T16:44:39.280 に答える
5

言語は、最小限の機能セットを備えているとは限りませんが(実際には、これまでにないほど優れています)、便利な機能セットを備えています。たとえば、次のコードがある場合:

if (!test_something())
  do_something();

これを次のように表現することもできます

if (test_something()) {
} else
  do_something();

しかし、それは読みにくいでしょう。したがって、論理否定は通常、C ++言語の他の構造で表現できますが、意図を示すために否定を明示的に表現することは読みやすさの向上に役立ちます。

于 2013-03-25T16:46:38.987 に答える
5

読みやすさを向上させるために、条件でtrue/falseを反転する必要がある場合に使用されます。例:比較

// Ensure that the thing is NOT red.
if (thing_is_red() == false)
    ...
if (!thing_is_red())
    ...
于 2013-03-25T16:47:52.900 に答える
2

!演算子は、ブール条件チェックの否定目的で使用されます。使えるところはたくさんあります。簡単な例:

 if (!existInArray(A, i))

iが配列に存在しないかどうかを確認してください。

于 2013-03-25T16:45:51.597 に答える
2

!または、NOT演算子は、論理的にはNOTゲートに相当します。

したがって、NOTゲート真理値表は、x真である場合!xは偽であると言います。およびその逆。

論理的に考えればそれほど難しくはありません。たとえば、男性のNOTは女性、NOT trueは偽、NOT単純は複雑です。

于 2013-03-25T16:47:41.160 に答える
2

あなたが言及するチュートリアル

NOT:NOT演算子は1つの入力を受け入れます。その入力がTRUEの場合はFALSEを返し、その入力がFALSEの場合はTRUEを返します。

これは、NOT演算子が単項演算子であることを意味します。単一のオペランド(二項演算子ではない)を意味します。

|| `のよう&& andに二項演算子であり、構文は次のとおりです。

  result = operand1  && operand2
  result = operand1  || operand2

単項は:

  result = !operand1 

その結果の値はオペランド値IDの復帰であり、結果はoperand1 = TrueFalseになり、operand1 = False結果がTrueの場合はFalseになります。

同じことがそこに書かれています:

たとえば、NOT(1)は0と評価され、NOT(0)は1と評価されます。NOT(ゼロ以外の任意の数)は0と評価されます。CおよびC ++では、NOTは!と記述されます。NOTは、ANDとORの両方の前に評価されます。

c / c ++では0Falseであり、Non0はTrueと同等です。

良い例もいくつかあります!

(1)。

!( 1 || 0 )  

1 || 0is1はtrueを意味し、NOT演算子を適用する0とFalseを意味することがわかっています。

    !( 1 || 0 )  
=>  ! (1)     
=>  0  that is false

||この式には、論理和演算子と!NOT演算子の2つの演算子があることに気づきましたか。

    !( 1  || 0 )  
    ^      ^
    NOT   OR  

OR演算子||については、単項NOTに対してビットシングルの2つのオペランドがあることに注意してください。

于 2013-03-25T16:50:06.090 に答える
2

最も頻繁なケースはおそらくstd::istream

int i;
std::cin >> i;
if ( ! std::cin ) {
    //  Something went wrong...
}

それ以外は、あらゆる種類のクラスにisValid()または isDone()関数があります。たとえば、GoFイテレータを使用して反復します。

for ( IteratorType i( init ); ! i.isDone(); i.next() ) {
    //  Do something with i.element()
}

マップクラスにはcontains関数があることが多いので、

if ( ! myMap.contains( key ) )

また、ブール変数を時々使用します。一致条件で複雑な評価が必要な線形検索の場合、たとえば次のようになります。

bool found = false;
int current = 0;
while ( ! found && current != end ) {
    //  maybe set found...
}
于 2013-03-25T16:50:06.617 に答える
2

さて、2つの数値の合計を3番目の数値に分割したいので、3番目の数値がゼロでない場合にこれを行うことができます。

    #include <iostream>
    using namespace std;
    int main()
   {
    int a,b,c,sum;
    cin >> a >> b >> c;
    sum = a+b;
    if (c!=0) //which is equivalent to if(!c)
    cout << sum/c;
   }

すぐに理解できるように、簡単な例を使用しました。今はすべて大丈夫ですか?よろしくとあなたの研究で頑張ってください。

于 2013-03-25T16:51:16.420 に答える
1

!演算子のポイントは、式になってfalseいる式を作成することですtrue。ほとんどの場合、== falseまたはの代わりに使用され== 0ます。多くの場合、式が読みやすくなります。

if(p == NULL || p-> next!= NULL)

と同じです:

if(!p || p-> next)

[わかりました。ここでの「読みやすい」というのは明らかに主観的なものです]。

于 2013-03-25T16:51:32.757 に答える
1

NOT演算子を説明する答えはかなりたくさんあります。

!私自身はオペレーターの大ファンではありません。本来あるべきほどには見えません(つまり、句の意味が逆になります)。

たとえば、C ++でのプログラミングに数年かかったにもかかわらず、その意味を即座に伝えるif ( ! ptr )のとは対照的に、解析にはまだ数秒かかります。if ( ptr == NULL )

if ( ! (i % 2) )偶数または奇数をチェックしますか?目が「?」を過ぎた後に答えがなかった場合、および/またはif条件を再度確認する必要がある場合は、私のケースを作成しただけです。

投稿を確認すると、NOT演算子をboolsおよび関数呼び出しに適用した場合に有効な用途があるというポスターのいくつかに同意します。ストリームの処理中に使用する!ことは慣用的と見なされます。

そうは言っても、私が知っているほぼすべてのプログラマーがに噛まれていstrcmpます。#define私は、などの数が少ない店で働いていた#define STRCMP_EQUAL 0ので、チェックを書く必要がありました。if ( STRCMP_EQUAL == strcmp(str1, str2) )これは、私の意見では、よりも桁違いに明確ですif ( ! strcmp(str1, str2) )

于 2013-03-25T17:24:48.380 に答える
1

!演算子は、ユーザー定義のデータ型(c ++のクラスと構造体)で使用できます。すべての演算子のように(expect。:and ::)!operatorはオーバーロードされる可能性があります。次のシナリオを参照してください。

//A is empty if memeber size is 0, and no further operations are allowed on other members if
// class is empty.
class A{
int size;
int lot;
int price;
public:
   bool operator!()
  {
      if(lot)
       return true; 
      else
      return false;
  }
};

A AObj;

//Aobj has size greater than 0
if(!Aobj)
{
//code to Fill or reuse the object.
}
于 2013-03-25T17:48:33.140 に答える
1

!のポイント 演算子は、偽の式を真の式にすることです。これは、==falseまたは==0の代わりとして最もよく使用されます。多くの場合、式が読みやすくなります。

if(p == NULL || p-> next!= NULL)

と同じです:

if(!p || p-> next)

[わかりました。ここでの「読みやすい」というのは明らかに主観的なものです]。

于 2013-03-25T17:49:22.777 に答える