C语言中返回语句中的逻辑运算符

3

我最近在学习C语言,发现了一些带有逻辑运算符的返回语句,例如:

return(statement LOGIC statement);

当语句评估为True或false(即1或0)时,LOGIC是逻辑运算符,如&&、||等。

这种写法是否是良好的编码实践呢?对我来说似乎有点不对劲,使用if/else if语句不是更好吗?


在我看来,这就像是说在if语句中使用&&是不好的编程习惯或者使用三目运算符是邪恶的。这取决于可读性、个人偏好等因素。 - cadaniluk
定义良好的编码实践 - Patrick87
1
一个人可以认为,函数只有一个出口点甚至是更好的编码风格。 - alk
如果第一个条件执行了return,则不需要使用else - Weather Vane
1
返回不是一个函数,请不要将 return(); 视为函数。 - Michi
5个回答

10

这种编码方式没有问题,实际上你不需要使用括号。要注意惰性求值。

return foo1() && foo2()

如果调用 foo1 的返回值为 false,则 foo2 不会被调用。


我认为正确的术语是“短路”。 - Caridorc
2
短路计算似乎更为常见,但在这种情况下我认为惰性求值同样正确。维基百科指出:“布尔控制结构的短路计算有时被称为惰性计算”。 - Manos Nikolaidis

5

我宁愿做

return a && b;

或者

int result = a && b;
return result;

只是因为出错的机会更少。如果您编写

if ( a && b )
  return true;
else
  return false;

你总是有可能把测试的意义搞错(即返回false时实际想要返回true,反之亦然)。这不是一个重大的风险,但是确实存在。在C99引入内置符号常量truefalse之前,人们通常会定义自己的TRUEFALSE宏。问题是,有些人偶尔会拼错01。我曾经花了一个下午来追踪自己的错误,因为有人放弃了一个头文件,其中TRUEFALSE扩展成了相同的值。巧合的是,那时我开始使用return expr而不是return TRUEreturn FALSE

4
省略if语句是良好的编码风格。使用if cond return true else return false过于冗长和多余。

0

这完全取决于程序员。有些人感觉使用逻辑运算符并返回0或1很舒适,而另一些人可能会感到有点不自然。

实际上,在工作方式上两者没有任何区别;我也不认为这是不好的编程习惯。

但是,ifelse可以更易读,从而帮助读者。


0

这取决于您的个人喜好。但是,查看复杂的解决方案并实施它们通常有助于您理解C语言中的复杂细节。一个简单的示例是:

 char mystring[10];
 //assume you take the input
 //to print it:
 int i;
 for(i=0;mystring[i]!='\0';i++)
 printf("%c",mystring[i]);

上述内容可以用更复杂的方式重写:

char *ch;
for(ch=mystring; *ch; ch++)
printf("%c",*ch);

这个漂亮地展示了指针如何被评估的复杂细节。理解并使用它肯定能够帮助你更好地理解C语言。

因此,请不要忽视这个复杂的表示,认为我会使用自己简化的版本。


1
这不应该是 for(ch=mystring; *ch; ch++) 吗? - Weather Vane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接