[英]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.