web-dev-qa-db-ja.com

C ++でint値にnot演算子を使用できますか?

奇妙な質問ですが、誰かが私にこれを見せてくれました、私はあなたが使用しないのだろうかと思っていました! C++のintの演算子? (私には奇妙です)。

#include <iostream>
using namespace std;

int main()
{
   int a=5, b=4, c=4, d;
   d = !( a > b && b <= c) || a > c && !b;
   cout << d;
   system ("pause");
   return 0;
}
15
001

はい。整数型の場合、_!_はオペランドがゼロの場合はtrueを返し、それ以外の場合はfalseを返します。

したがって、ここでの_!b_は単に_b == 0_を意味します。


これは、値がboolに変換される特定のケースです。 _!b_は!((bool)b)と見なすことができるため、問題はbの「真実性」とは何かということです。 C++では、算術型、ポインタ型、列挙型をboolに変換できます。値が0またはnullの場合、結果はfalseになります。それ以外の場合は、trueになります(C++§4.1.2)。

もちろん、カスタムクラスは_operator!_またはoperator <型はboolに変換できます>をオーバーロードして、クラスに_!b_を許可することもできます。たとえば、_std::stream_は、フェイルビットをチェックするために_operator!_と_operator void*_をオーバーロードしているため、次のようなイディオムがあります。

_while (std::cin >> x) {   // <-- conversion to bool needed here
  ...
_

に使える。

(ただし、コード!( a > b && b <= c) || a > c && !bは不可解です。)

25
kennytm

元々、C(C++のベース)にはブール型はありませんでした。代わりに、値「true」がゼロ以外の値に割り当てられ、値「false」がゼロと評価されるものに割り当てられました。この動作はC++でも引き続き存在します。したがって、int x、式!xは、「x not true」、つまり「x not non-zero」を意味します。つまり、xがゼロの場合はtrueです。

7
Amnon

!b(b == 0)と同等です。

4
vitaut

Intのテストは、ゼロ以外の値の場合はtrue、ゼロ値の場合はfalseであるため、ゼロ値の場合はtrueでなく、ゼロ以外の値の場合はfalseです。

3
Puppy

ビルトイン!演算子は引数をboolに変換します。標準では、任意の算術型からの変換が存在することを指定しています(intchar、.... floatdouble...)to bool。ソース値が0の場合、結果はtrueになります。それ以外の場合、結果はfalseになります。

3
Armen Tsirunyan