1

私は以下を行いました:

if( '0' <= infix.at(i)<= '9'){
// some logic
}

コンパイラは、動作中のタイプ「bool」の安全でない使用を警告しました。私はそれを次のように変更しました:

if( '0' <= infix.at(i)&& infix.at(i) <= '9') 

今では動作します。最初のものは C++ では許可されていませんか??

4

2 に答える 2

8

最初のバージョンは次のように評価されます

if( ( '0' <= infix.at(i) ) <= '9' )

boolこれが、意味をなさないという警告が表示される理由ですtrue/false <= '9'

一部の言語では比較演算子を連鎖できますが、C++ はそれらの 1 つではありません。

于 2013-01-21T07:12:40.953 に答える
1

a <= b <= c他の人が説明したように、優先順位は式を にグループ化し(a <= b) <= c、評価される最初の部分a <= bは、通常、ブール値の true/false 値を返すと予想されます。

もちろん、aand/orがユーザー定義型の場合、ブール値ではなくユーザー定義オブジェクトを返すbカスタムを作成でき、意図した連鎖をサポートできます。operator<=(したがって、Amber の主張「一部の言語では比較演算子を連鎖できますが、C++ はその 1 つではありません。」はユーザー定義型には当てはまりませんが、それでも良いアドバイスです - 以下を参照してください)。チェーンは実行時に最も簡単に実行できます (つまりbool、以前の比較の結果を示すオブジェクトと、さらにチェーンされた比較のために lhs を形成する値を保持するオブジェクトを返すことにより) が、テンプレート式と効率的な短絡評価が得られます。

他のプログラマーはあなたのコードがそのように評価されることを期待しないので、それが良い考えであることはめったにありません。それは彼らを混乱させ、数か月後にコードを保守するために戻ってきたときにエラーが発生する可能性が非常に高くなります。何があっても、ユーザー定義以外の型に対してそのような順序付けをサポートすることはできません。また、一般的に、式で値を混在させる方法にそのような制限があることは問題です。攻撃するつもりはありませんが、この質問をする必要がある場合は、おそらくこれを実装しようとする準備ができていないか、リスクを回避する準備ができていません。

于 2013-01-21T08:17:07.320 に答える