[英]Ternary operator argument evaluation in C
我一直在使用一些代碼來確保 MISRA 合規性。 這段代碼的問題是
Operands shall not be of an inappropriate essential type. The operand of the ? operator is of an inappropriate essential type category unsigned.
我認為問題在於第一個參數是無符號數據類型,而不是布爾值,這意味着下面的修復將起作用。
原本的,
return (uint32Var & 0x80000000u) ? 0u : 1u;
我對代碼的更改,
return ( (uint32Var & 0x80000000u)!=0u ) ? 0u : 1u;
這是一個正確的改變嗎? 我擔心更改代碼的功能,但據我所知,至少在 if 邏輯中,操作數在if ( numVar )
運算符中被評估為numVar != 0
。
那是安全的。
您將比較無符號 32 位:
(uint32Var & 0x80000000u)
到unsigned int
:
0u
通常的算術轉換適用於確保無論此處涉及的實際類型如何,您都將比較至少足夠大以包含無符號 32 位的類型的值。
如果值(uint32Var & 0x80000000u)
等於0
則為假一,否則為真。 將值與0
進行比較會產生影響,如果比較相等則產生0
,否則產生1
是等效行為。
另請注意,您最終用於三元運算符的第一個操作數的值不是bool
,而是int
。 !=
運算符產生0
或1
的int
值。
我認為問題在於第一個參數是無符號數據類型,而不是布爾值,這意味着下面的修復將起作用。 /--/
這是一個正確的改變嗎?
是的。 如在,它將使代碼符合 MISRA。 警告確實是關於對第一個操作數使用非布爾類型。
但是,假設該函數返回uint32_t
,您也可以這樣寫:
return (uint32_t) !(uint32Var & mask);
( mask
,因為MISRA,和其他人一樣,不鼓勵使用“幻數”的。)
等效且兼容 MISRA-C:
return ~uint32Var >> bits; // where bits in this case is 31
通常,在編寫 MISRA 兼容代碼時~
運算符是一個令人討厭的部分,但是當您使用無符號整數類型(不是小整數類型)時,它是完全安全的,例如uint32_t
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.