私は以下を行いました:
if( '0' <= infix.at(i)<= '9'){
// some logic
}
コンパイラは、動作中のタイプ「bool」の安全でない使用を警告しました。私はそれを次のように変更しました:
if( '0' <= infix.at(i)&& infix.at(i) <= '9')
今では動作します。最初のものは C++ では許可されていませんか??
私は以下を行いました:
if( '0' <= infix.at(i)<= '9'){
// some logic
}
コンパイラは、動作中のタイプ「bool」の安全でない使用を警告しました。私はそれを次のように変更しました:
if( '0' <= infix.at(i)&& infix.at(i) <= '9')
今では動作します。最初のものは C++ では許可されていませんか??
最初のバージョンは次のように評価されます。
if( ( '0' <= infix.at(i) ) <= '9' )
bool
これが、意味をなさないという警告が表示される理由ですtrue/false <= '9'
。
一部の言語では比較演算子を連鎖できますが、C++ はそれらの 1 つではありません。
a <= b <= c
他の人が説明したように、優先順位は式を にグループ化し(a <= b) <= c
、評価される最初の部分a <= b
は、通常、ブール値の true/false 値を返すと予想されます。
もちろん、a
and/orがユーザー定義型の場合、ブール値ではなくユーザー定義オブジェクトを返すb
カスタムを作成でき、意図した連鎖をサポートできます。operator<=
(したがって、Amber の主張「一部の言語では比較演算子を連鎖できますが、C++ はその 1 つではありません。」はユーザー定義型には当てはまりませんが、それでも良いアドバイスです - 以下を参照してください)。チェーンは実行時に最も簡単に実行できます (つまりbool
、以前の比較の結果を示すオブジェクトと、さらにチェーンされた比較のために lhs を形成する値を保持するオブジェクトを返すことにより) が、テンプレート式と効率的な短絡評価が得られます。
他のプログラマーはあなたのコードがそのように評価されることを期待しないので、それが良い考えであることはめったにありません。それは彼らを混乱させ、数か月後にコードを保守するために戻ってきたときにエラーが発生する可能性が非常に高くなります。何があっても、ユーザー定義以外の型に対してそのような順序付けをサポートすることはできません。また、一般的に、式で値を混在させる方法にそのような制限があることは問題です。攻撃するつもりはありませんが、この質問をする必要がある場合は、おそらくこれを実装しようとする準備ができていないか、リスクを回避する準備ができていません。