簡體   English   中英

C中的三元運算符參數評估

[英]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 !=運算符產生01int值。

我認為問題在於第一個參數是無符號數據類型,而不是布爾值,這意味着下面的修復將起作用。 /--/

這是一個正確的改變嗎?

是的。 如在,它將使代碼符合 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM