メインコンテンツ

AUTOSAR C++14 Rule A5-16-1

The ternary conditional operator shall not be used as a sub-expression

説明

ルール定義

条件付き三項演算子を部分式として使用してはなりません。

根拠

条件付き三項演算子が部分式として使用されると、式全体の可読性が損なわれ、保守が困難になります。三項演算子の結果を変数に代入し、後続の演算でその変数を使用することで、多くの場合、式は視覚的にわかりやすくなります。

Polyspace 実装

チェッカーは、いくつかの例外を除き、部分式で条件付き三項演算子が使用された場合にフラグを立てます。次のような場合における三項演算子の使用は例外と見なされます。

  • 結果が変数に代入される。

  • 結果が関数の引数として使用される、または結果が関数から返される。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#include <cstdint>
const int ULIM = 100000;

std::int32_t foo(int32_t x) {
    int ret;
    ret = (x <= 0? 0: (x >= ULIM? 0 : x)); //Noncompliant
    return ret;
}

std::int32_t bar(int32_t x) {
    int ret, retInterim;
    retInterim = x >= ULIM? 0 : x; //Compliant
    ret = retInterim <= 0? 0 : retInterim; //Compliant
    return ret;
}

この例では、foo で、条件付き三項演算子が 2 つ目の演算とチェーンになっていて、x[0, ULIM] の範囲内にあれば値 0 を返し、それ以外の場合は x を返します。xULIM を比較する三項演算子がチェーン全体の部分式となっており、ルールに違反します。

bar では、条件付き三項演算子の各々が独立した手順で記述されており、ルールに違反しません。同じアルゴリズムを、条件を boolean 型の AND 演算子と結合し、単一の条件付き三項演算子を使用することでも実装できます。

チェック情報

グループ:
カテゴリ: Required、Automated

バージョン履歴

R2019b で導入