任何运营商的退货类型是什么? 怎么判断呢? 它是平台依赖的吗?
当我正在执行MISRA代码合规时,这个问题突然出现了 需要对if关键字的参数进行类型转换,如此
if((bool_t)(cmd <= 1)){}
安抚14.4 MISRA要求指南的lint。 你能指点我一些关于操作员退货类型的文件吗? 如果有人能找到有关返回类型的文件 运营商请在此发布,因为这对人们有很大的帮助 在下文中提到。
答案 0 :(得分:0)
使用if(1){...}
执行{}
中的代码
使用if(0){...}
{}
中的代码未执行
返回类型为int
,C中的等式/关系运算符(==,&lt; =,&gt; =,...)返回1
true 和0
false
答案 1 :(得分:0)
在C
中返回operator ==的类型
...结果的类型为int
。 ...... C11dr平等运营商§6.5.93
任何运营商的退货类型是什么?
有时它取决于运算符和操作数
a*b --> result type could be `int`, `double`, etc.
其他人,这是固定的。
a==b --> result type is `int`.
如何确定?
通过代码分析 - 您或静态分析器查看代码。
在运行时,使用_Generic()
以下处理许多情况。
#define typenameX(X) _Generic((X), \
_Bool: "_Bool", \
signed char: "signed char", \
char: "char", \
unsigned char: "unsigned char", \
short: "short", \
unsigned short: "unsigned short", \
int: "int", \
unsigned: "unsigned", \
long: "long", \
unsigned long: "unsigned long", \
long long: "long long", \
unsigned long long: "unsigned long long", \
float: "float", \
double: "double", \
long double: "long double", \
_Complex float: "_Complex float", \
_Complex double: "_Complex double", \
_Complex long double: "_Complex long double", \
void *: "void *", \
char *: "char *", \
const char *: "const char *", \
default: "other" \
)
int main(void) {
double a = 2.0;
puts(typenameX(a));
puts(typenameX(a==4.0));
short b;
puts(typenameX(b));
puts(typenameX(b*1));
puts(typenameX(sizeof(b)));
double cmd;
puts(typenameX(cmd <= 1));
}
输出
double
int
short
int
unsigned long
int
它是否依赖于平台?
使用cmd <= 1
,C中的返回类型为int
- “平台无关”。
((int)i) * 123456
的结果类型是“平台相关的”。例如,它可以是int
或long
。
你能指点我一些关于操作员返回类型的文件吗?
如果是if((bool_t)(cmd <= 1)){}
,则cmd <= 1
的结果类型为int
。 C11§6.5.86。在C语言中编译时不需要bool_t
。由于结果类型可能因其他语言(或不兼容的C编译器)而不同,因此需要编译的代码不止一个语言可能会受到演员的好处。
关于操作员返回类型的最佳文档是(最新的)C规范。
关于“需要对if
关键字的参数进行强制转换”的问题在神秘的情况下发挥作用。 C中比较的结果是不其中之一。
C阱将if(expression)
的结果定义为“如果表达式比较不等于0”。 C11dr§6.8.4.12
不兼容编译器可以将浮点数或宽整数首先转换为int
,然后将然后测试转换为零。 if((bool_t)x)
解决了这个问题。
unsigned long long w = 0x800000000000u;
if (w) {
double x = 4294967296.0; // 0x1 0000 0000
if (x) {
double y = 0.123;
if (y) {
处理NaN是有问题的。 OTOH,C没有很好地定义NaN如何与0进行比较.IEEE 758很好地定义了它,许多C实现都遵循这一点。在这种情况下,我没有看到施放给(bool_t)
有帮助,因为它同样失去了NaN。
double z = 0.0/0.0; // z is NaN;
if (z) {
if (!z) {
在早期的C ++中,也没有布尔值。用户定义的对象(但不是double
,float
,指针)已转换为int
if()
。如果非零值转换为int 0
,则算术类(例如,影响256整数)将会出现问题。使用!!
解决了这个问题。
myint256 a = foo();
if (!!a) {
注意:如果编译器没有真正的布尔类型,那么(bool_t)
可能是某种整数类型,肯定会犯规代码,就像上面一样。