当前位置:  开发笔记 > 编程语言 > 正文

如何处理错误的"控制到达无效功能的结束"gcc警告?

如何解决《如何处理错误的"控制到达无效功能的结束"gcc警告?》经验,为你挑选了3个好方法。

如果您不想添加"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);
}


Christoph.. 11

你的sign()功能效率不高.试试这个

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

资料来源:Bit Twiddling Hacks



1> Eric..:

如果您不想添加"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);
}



2> Christoph..:

你的sign()功能效率不高.试试这个

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

资料来源:Bit Twiddling Hacks


作为计算符号的优雅解决方案,是否更好地回答有关警告的问题?

3> Jonathan Lef..:

在这种情况下,我会寻求解决方案:

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> 0) - (i <0);查看了Christoph的解决方案. - 我之前从未见过的变种.代码大小为:

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

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

推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有