奇妙な質問ですが、誰かが私にこれを見せてくれました。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;
}
奇妙な質問ですが、誰かが私にこれを見せてくれました。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;
}
はい。整数型の場合、オペランドがゼロの場合は!戻り、それ以外の場合は戻ります。truefalse
したがって、!bここでは単に を意味しb == 0ます。
これは、値が に変換される特定のケースboolです。は、 の「真実」とは何かという問題と!b見なすことができます。C++ では、算術型、ポインター型、および列挙型を に変換できます。値が 0 または null の場合、結果はになり、それ以外の場合は(C++ §4.1.2) になります。!((bool)b)bboolfalsetrue
もちろん、カスタム クラスは、operator!またはoperator<型を bool に変換できます> をオーバーロードして!b、それらのクラスの たとえば、failbit をチェックするためにandを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真ではxない」、つまり「非ゼロ」を意味します。つまり、xがゼロの場合は真です。
と!b同等(b == 0)です。
組み込み!演算子は、その引数を に変換しますbool。標準では、任意の算術型 ( , ,.... , ...) から boolへの変換が存在するintcharfloatdoubleことが指定されています。ソース値が 0 の場合、結果はtrue、それ以外の場合はfalse
int のテストは、ゼロ以外の値の場合は真、ゼロ値の場合は偽であるため、not はゼロ値の場合は真であり、ゼロ以外の値の場合は偽です。