奇妙な質問ですが、誰かが私にこれを見せてくれました、私はあなたが使用しないのだろうかと思っていました! 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;
}
はい。整数型の場合、_!
_はオペランドがゼロの場合は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
は不可解です。)
元々、C(C++のベース)にはブール型はありませんでした。代わりに、値「true」がゼロ以外の値に割り当てられ、値「false」がゼロと評価されるものに割り当てられました。この動作はC++でも引き続き存在します。したがって、int x
、式!x
は、「x
not true」、つまり「x
not non-zero」を意味します。つまり、x
がゼロの場合はtrueです。
!b
は(b == 0)
と同等です。
Intのテストは、ゼロ以外の値の場合はtrue、ゼロ値の場合はfalseであるため、ゼロ値の場合はtrueでなく、ゼロ以外の値の場合はfalseです。
ビルトイン!
演算子は引数をbool
に変換します。標準では、任意の算術型からの変換が存在することを指定しています(int
、char
、.... float
、double
...)to bool。ソース値が0の場合、結果はtrue
になります。それ以外の場合、結果はfalse
になります。