gpt4 book ai didi

c - MISRA C :2012 Rule 14. 4

转载 作者:行者123 更新时间:2023-12-04 10:09:55 26 4
gpt4 key购买 nike

根据 MISRA 规则
if 语句的控制表达式和迭代语句的控制表达式本质上应该是 bool 类型

#include <stdbool.h>
#include <stdlib.h>

void foo(void){
int i = 0;

if(i){} /* Non-compliant - int32_t is not boolean */

if(i != 0){} /* Compliant */

}

我无法理解仅使用值如何会导致问题。为什么只添加 bool 表达式被视为良好做法。
任何见解都会有所帮助

最佳答案

规则提供了基本原理:强类型。控制表达式本质上应该是 bool 类型。等式、关系等运算符的结果被视为本质上是 bool 值,而显示在 int 中。或不带运算符的指针意味着该表达式是所使用的类型。

(作为旁注,这对于与 C++ 的兼容性可能很重要,其中许多运算符实际上返回 bool ,并且可能会被返回 operatorbool 函数重载。)

然而,主要的原因不是由 MISRA 提供的,那就是自我记录的代码。 if(ptr != NULL)只能是指针与 NULL 的比较。没有误解的余地。 if(ptr)可能是与 NULL 的比较,也可能是手指的意外滑动,而程序员实际上是指 if(*ptr) .另外,如果指针有一些神秘的名字,那么 if(xyz) 是什么并不明显。确实如此,但很明显 if(xyz != NULL)是。

此规则还可以防止诸如 if(func) 之类的错误。哪里if(func())是有意的。请记住,许多 MISRA 规则都是为了静态分析器的利益而存在的。

关于强类型,请考虑以下示例:

#include <stdio.h>
#include <stdbool.h>

int main (void)
{
int x = false;
x = ~x;

if(x)
{
puts("x is true");
if(x!=true)
{
puts("but x is not true\n");
}
}

bool y = x;

if(y)
{
puts("y is true");
if(y==true)
{
puts("I swear, y is really true");
}
}
}

输出:
x is true
but x is not true

y is true
I swear, y is really true

关于c - MISRA C :2012 Rule 14. 4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52780276/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com