$ cat t.cpp
int sign(int i) {
if(i > 0) return 1;
if(i == 0) return 0;
if(i < 0) return -1;
}
$ g++ -c t.cpp -Wall
t.cpp: In function ‘int sign(int)’:
t.cpp:5: warning: control reaches end of non-void function
$
我该怎么办?
停止使用-Wall,因为它显然是错误的?最后添加一个虚假的返回0?用“else”子句填充代码?
答案 0 :(得分:17)
如果您不想添加“else”子句,因为它们会使代码更长,那么您可能希望删除最后的“if”并使代码更短:
int sign(int i) {
if(i > 0) return 1;
if(i == 0) return 0;
return -1; // i<0
}
或者,如果你真的在计算“签名”,这不是一个更长的例子的简化:
int sign(int i) {
return (i>0) ? 1 : ((i<0)?-1:0);
}
答案 1 :(得分:11)
答案 2 :(得分:5)
在这种情况下,我会选择解决方案:
int sign(int i)
{
if (i > 0)
return 1;
else if (i == 0)
return 0;
else
return -1; // i<0
}
也就是说,我会添加两个else子句 - 使代码更加对称,而不是因为它对生成的目标代码产生任何影响。
我做了一些实验。我期望使用三元运算符两次的单行版本生成与更长的相同的代码。但是,使用GCC v4.3.2在Solaris 10(SPARC)上进行测试表明,三元运算符版本始终比“if”版本小12-16个字节。然而,额外的其他的存在或不存在确实没有区别。 (正如我所料,添加寄存器没有任何可能性。)已添加我还用'return(i&gt; 0) - (i&lt; 0);'查看了Christoph的解决方案。 - 我之前从未见过的变种。代码大小为:
Unoptimized Optimized (-O5)
if 166 110
?: 150 98
>-< 122 98
这主要表明测量是一个好主意!
答案 3 :(得分:3)
else
条款不是“杂乱无章”,它们是说明你意图的更明显的方式。