2015-02-06 61 views
2

我想有一个角度的嵌入式软件发展的角度,我想问哪一个更好一起去,什么是可能的优势和劣势?在C语言中,检查分支语句的函数返回值的最佳做法是什么?

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

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

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

定义'更好'。 – Biffen 2015-02-06 12:42:33

+0

感谢您的评论,但我不得不说“更好”,因为它可能在性能,可靠性或其他任何我无法预见的方面更好。因此而要求优点和缺点。 @Biffen – 2015-02-06 12:48:32

+4

不要担心这种微观优化。只要在意图明确且易于理解的地方编写干净的代码即可。 – kkrambo 2015-02-06 13:12:21

回答

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

为您检查函数的返回值将作出的决定和你的函数返回0或1

而且这里有一个优势,在第二次的选择,因为这是完全正常您只需保存一个变量retVal的空间即可保存返回值并执行检查。

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

+0

实际上,它返回'true'或'false',它毕竟返回'bool'。 :) – unwind 2015-02-06 12:57:13

+0

@unwind对不起?我没有得到..? – Gopi 2015-02-06 12:59:25

+0

'0'和'1'是整数,但函数的返回类型是'bool',所以返回的值是'false'或'true'。当然,这些转换为整数“0”和“1”并带有预期的结果,但这并不意味着它们是两个整数。 – unwind 2015-02-06 13:16:10

1

的第一选择(注拼写)更好,但是由于与你想象的完全无关的原因。

原因是它只是一行代码较短,因此您有一行代码不必担心,在试图理解其工作原理时必须阅读的代码行数少于一行将来必须维护的代码行。

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

如果你有这样一个基本性质的问题,我强烈建议你退出试图“有鉴于嵌入式软件开发点”。嵌入是困难的;尝试非嵌入式,这很容易。一旦你掌握了非嵌入式,那么你可以尝试嵌入式。

2

这两种方法都将正常工作。如果将代码定义得更好,代码将在编译时执行(非常轻微)并且占用(非常少)更少的空间,则替代方法1)更好。方法1)将函数的值读入一个寄存器,并分支两个命令的值,并且不使用存储器。备选2)将读取功能到寄存器的值,将值写入存储器,从存储器读取的值插入值的寄存器和分支 - 总共四个命令和四个字节的存储空间(假定32位处理器)。

+1

我建议你原型这个;你会发现两种选择在任何现代编译器上都会以相同的机器代码结束。 – Ross 2015-02-06 14:06:26

2

要么是在这个例子中大概OK,但在调试步进你就会知道是否分支被采用之前的状态是真实的,可以强制变量到不同的值,如果代码时,当第二个有微弱的优势您希望测试备用路径,并且在调试过程中可以在任何情况下有助于查看调用结果。

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

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

如果x()返回true,那么y()不会被求值,其可以是或可以不是可取的,如果y()有副作用,所以它们的语义并不相同:

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

使用显式赋值可以明确表达所需的语义。例如,如果你想要短路语义的话。

相关问题