在C语言中,检查分支语句的函数返回值的最佳实践是什么?

时间:2015-02-06 12:41:23

标签: c embedded machine-code

我正在尝试从嵌入式软件开发的角度出发,我想问哪一个更好用,哪些可能的优点和缺点?

bool funct(){
   bool retVal = 0;
   //do something
   return retVal;
}

//First Choice
if(funct()){
   //do something
}

//Second Choice
bool retVal = funct();
   if(retVal)
  {
    //do something
  }

4 个答案:

答案 0 :(得分:3)

//First Choise
if(funct()){
   //do something
}

这是完全正常的,因为你检查函数的返回值来做出决定,你的函数返回0或1。

此外,第二种选择还有一个优势,因为您只需保存一个变量retVal的空间来保存返回值并执行检查。

如果需要使用返回值,不仅仅是为了检查条件和程序中的其他地方,那么我建议存储返回值(选项2)

答案 1 :(得分:2)

两种方法都可以正常工作。如果您更好地定义将执行(非常轻微)更快的代码并在编译时占用(非常轻微)更少的空间,那么备选1)更好。备选方案1)将函数的值读入寄存器并在两个命令中对值进行分支并且不使用内存。备选方案2)将函数的值读入寄存器,将值写入存储器,将值从存储器读入寄存器并对值进行分支 - 总共四个命令和四个字节的存储(假设一个32位处理器) )。

答案 2 :(得分:2)

在这个例子中可能都没有,但是第二个在调试时有一点点优势,当你踩到代码时,你会知道在获取分支之前条件是否为真,并且如果你将变量强制转换为不同的值想要测试备用路径,并且能够在调试期间在事件有用之后看到调用的结果。

在更复杂的表达式中,该方法可能更重要,例如:

if( x() || y() ) ...

如果x()返回true,则不会评估y(),如果y()有副作用,这可能是也可能不合适,因此其语义不同于:

bool xx = x() ;
bool yy = y() ;
if( xx || yy ) ...

使用显式赋值可以清楚地表达所需的语义。例如,如果您打算使用短路语义。

答案 3 :(得分:1)

第一个选择(注意拼写)更好,但原因与您的想法完全无关。

原因是它是一行代码更短,因此您需要担心的代码行少一行,在尝试理解其工作原理时需要读取的代码行少一行,少一行代码代码必须在将来维护。

在任何现实情况下,性能考虑都是毫无意义的,事实上,我愿意猜测,任何中途不错的编译器都会为这两种选择生成完全相同的机器代码。

如果您对这种基本性质有疑问,我强烈建议您放弃尝试“从嵌入式软件开发的角度来看”。嵌入式很难;尝试非嵌入式,这更容易。掌握非嵌入式后,即可尝试嵌入式。