c-如果flag=0,那么执行true或false块的最佳语句是哪个?if(!flag)或if(flag==0)



在这里给出的代码中:

void search(int a)
{
int i = 0, flag = 1;
for(; i < MAX; i++)
{
if(a == stack[i])
{
flag = 0;
break;
}
}
if(!flag)
printf("%d found at location %d.n", a, i);
else
printf("%d not found in the stack.n", a);
return;
}

哪个语句if(!flag) or if(flag == 0)将更有效和更通用?使用if(!flag)是否被认为是一种错误的方法?

两个版本之间几乎没有技术差异:

  • !整数提升其操作数并返回int10
  • ==根据通常的算术转换(包括整数提升(平衡两个操作数,然后返回int10

在大多数情况下,您将获得相同的机器代码。所以这主要是一个编码风格的问题,因此是主观的。

根据经验,传递给if的任何内容都应该被视为布尔类型。C在语言中没有集成的布尔类型,因此上面的运算符返回int而不是bool,这将更有意义,也更有助于C++的工作方式。出于向后兼容性的原因,C使用int

然而,我们可以编写C代码,就好像语言有适当的布尔集成一样——假设它有。这是MISRA-C等各种编码标准推荐的立场。但在这种特定的情况下,这也不会影响代码。您可以将flag替换为值为true/false的标准Cbool,但使用!flagflag==false仍然可以。

仅为了可读性,我会将您的示例重写为:

#include <stdio.h>
#include <stdbool.h>
void search (int key)
{
bool found = false;
int i;
for(i=0; i<MAX && !found; i++)
{
if(key == stack[i])
{
found = true;
}
}
if(found)
printf("%d found at location %d.n", key, i);
else
printf("%d not found in the stack.n", key);
}

生成的机器代码应该相同。主要的可读性问题是缺少有意义的变量名。

最新更新