C++ 在MISRA C++;2008年,有人知道规则5-0-3中出现的特殊概念C值表达式吗?
从C值的概念,我意识到 不应进行进一步的隐式或显式转换的表达式称为cvalue表达式 但以这条规则为例C++ 在MISRA C++;2008年,有人知道规则5-0-3中出现的特殊概念C值表达式吗?,c++,misra,C++,Misra,从C值的概念,我意识到 不应进行进一步的隐式或显式转换的表达式称为cvalue表达式 但以这条规则为例 s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant s32 = s32 + s8; // Example 3 - Compliant s32=static\u cast(s8)+s8;//示例2-符合 s32=s32+s8;//示例3-符合 显然,正确的加法表达式在这里进行隐式和显式转换。这条规
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant
s32=static\u cast(s8)+s8;//示例2-符合
s32=s32+s8;//示例3-符合
显然,正确的加法表达式在这里进行隐式和显式转换。这条规则将它们标记为符合。我认为这与价值的概念相冲突。在MISRA Cpp 2008第57页末尾: 类似,除非下面列出:
- 其他未列出的表达式不是cvalues,具有操作的基本类型
s8
然后,s8
不是cvalues,它具有操作的基本类型,在您的示例中,它的基本类型是int32\t
。升级到int32\t
并不违反规则
5-0-3的要点是,它希望确保所有操作都在相同的底层类型中执行
int32_t s32;
int8_t s8;
s32 = static_cast < int32_t > ( s8 ) + s8; // Example 2 - Compliant
s32 = s32 + s8; // Example 3 - Compliant
它不符合要求,因为加法运算符是使用
int
类型执行的,结果将转换为int32\u t
,这与int
不必相同,因此不符合要求。您能否解释或包含指向“cvalue”定义的链接对于那些不熟悉MISRA?YAP的人,就像我所说的,“CValk”的定义是“代码”:一个不应该再进行进一步转换的表达式,不管是隐含的还是显式的,都被称为CValm表达式。< /C>实际上在C++ >代码>符号CHAR x=127,y=127;intz=x+y的定义非常完美,在任何实现中,z
都是254。我同意你的观点。与您相同的引用:在MISRA Cpp 2008第57页的末尾:`二进制表达式不是Cvalue,它们的底层类型是应用底层类型转换的结果。`这里说二进制表达式不是Cvalue,无论这与s32=static_cast(s8)+s8;//示例2-符合
<如果我这样改变代码:s32=(int32_t)(s8+s8)代码>应该是不兼容的。它是在加性部分后面列出的,所以您认为“s32=STATICESTCAST <32”(S8)+S8',应该是属于赋值运算符“=”不是加法运算符“+”。
int32_t s32;
int8_t s8;
s32 = s8 + s8;