Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在MISRA C++;2008年,有人知道规则5-0-3中出现的特殊概念C值表达式吗?_C++_Misra - Fatal编程技术网

C++ 在MISRA C++;2008年,有人知道规则5-0-3中出现的特殊概念C值表达式吗?

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-符合 显然,正确的加法表达式在这里进行隐式和显式转换。这条规

从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-符合

显然,正确的加法表达式在这里进行隐式和显式转换。这条规则将它们标记为符合。我认为这与价值的概念相冲突。

在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;