返回运算符的类型==在C中

时间:2016-04-09 12:46:25

标签: c types misra

任何运营商的退货类型是什么? 怎么判断呢? 它是平台依赖的吗?

当我正在执行MISRA代码合规时,这个问题突然出现了 需要对if关键字的参数进行类型转换,如此

if((bool_t)(cmd <= 1)){} 

安抚14.4 MISRA要求指南的lint。 你能指点我一些关于操作员退货类型的文件吗? 如果有人能找到有关返回类型的文件  运营商请在此发布,因为这对人们有很大的帮助  在下文中提到。

2 个答案:

答案 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`.
  

如何确定?

  1. 通过代码分析 - 您或静态分析器查看代码。

  2. 在运行时,使用_Generic()

  3. 以下处理许多情况。

    #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的结果类型是“平台相关的”。例如,它可以是intlong

      

    你能指点我一些关于操作员返回类型的文件吗?

    如果是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 ++中,也没有布尔值。用户定义的对象(但不是doublefloat,指针)已转换为int if()。如果非零值转换为int 0,则算术类(例如,影响256整数)将会出现问题。使用!!解决了这个问题。

    myint256 a = foo();
    if (!!a) {
    

    注意:如果编译器没有真正的布尔类型,那么(bool_t)可能是某种整数类型,肯定会犯规代码,就像上面一样。