Cの昔は、ブール型はありませんでした。人々はint
ブールデータを保存するために使用し、それはほとんど働いた。 ゼロは偽であり、他のすべては真実でした。
これint flag = 0;
はflag++
、値を取得し、後で実行した場合に値が真になることを意味します。これは、フラグの値が何であっても機能します(多くの場合を除き、ロールオーバーしてゼロに戻りましたが、それは無視できます) -値が1のときにフラグをインクリメントすると2が得られます本当。
一部の人々は、ブール値を無条件にtrueに設定するためにこれを使用しました。私はそれが今までにイディオムになったとは確信していませんが、それはいくつかのコードで。
--
値が1(それが可能性がある)以外の場合、値はまだfalseにならないため、これは決して機能しませんでした。そして、それが既に偽(0
)であり、それに対してデクリメント演算子を実行した場合、偽のままではありません。
初期の段階でCからC ++にコードを移動する場合、C ++に含まれるCコードが引き続き機能できることが非常に重要でした。そのため、C ++の仕様(セクション5.2.6(71ページ))では次のように書かれています:
接尾辞++を適用して得られる値は、演算子を適用する前にオペランドにあった値です。[注:得られる値は元の値のコピーです]オペランドは変更可能な左辺値でなければなりません。オペランドの型は、算術型または完全なオブジェクト型へのポインタでなければなりません。結果が記録された後、オブジェクトがtype bool
である場合を除き、オブジェクトの値は1を追加して変更されます。その場合、オブジェクトはtrueに設定されます。[注:この使用は非推奨です。付録Dを参照してください。]
接尾辞のオペランド-は、接尾辞++演算子と同様にデクリメントされますが、オペランドはtypeであってはなりませんbool
。
これはセクション5.3.2で再び言及されています(プレフィックス演算子の場合-5.2.6はpostfixにありました)
ご覧のとおり、これは非推奨(709ページのドキュメントの付録D)であり、使用すべきではありません。
しかし、それが理由です。また、コードが表示される場合があります。しかし、それをしないでください。