6
$ 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”子句弄乱代码?

4

4 回答 4

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);
}
于 2009-01-18T15:58:34.473 回答
11

你的sign()功能不是很有效。试试这个

int sign(int i) {
    return (i > 0) - (i < 0);
}

资料来源:Bit Twiddling Hacks

于 2009-01-18T16:01:44.750 回答
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 个字节。但是,是否存在额外的 else 并没有区别。(正如我所料,添加寄存器没有任何可能性。) 补充说,我还用'return(i> 0)-(i < 0);'查看了克里斯托夫的解决方案。- 我以前没见过的变种。代码大小为:

       Unoptimized     Optimized (-O5)
 if      166             110
 ?:      150              98
 >-<     122              98

这主要表明测量是个好主意!

于 2009-01-18T17:36:28.350 回答
3

else子句不是“杂乱无章”的,它们是表达您意图的更明显的方式。

于 2009-01-19T00:02:40.487 回答