C++ “如何处理错误”;控制达到非无效函数的末尾“;gcc警告? $cat t.cpp 整数符号(整数i){ 如果(i>0)返回1; 如果(i==0)返回0; 如果(i0)返回1; 如果(i==0)返回0; return-1;//i0)?1:((i
我该怎么办 停止使用-墙,因为它显然是错误的?是否在末尾添加假返回0?将代码与“else”子句混在一起?如果您不想添加“else”子句,因为它们会使代码变长,那么您可能希望删除最后的“If”并缩短代码:C++ “如何处理错误”;控制达到非无效函数的末尾“;gcc警告? $cat t.cpp 整数符号(整数i){ 如果(i>0)返回1; 如果(i==0)返回0; 如果(i0)返回1; 如果(i==0)返回0; return-1;//i0)?1:((i,c++,gcc,warnings,C++,Gcc,Warnings,我该怎么办 停止使用-墙,因为它显然是错误的?是否在末尾添加假返回0?将代码与“else”子句混在一起?如果您不想添加“else”子句,因为它们会使代码变长,那么您可能希望删除最后的“If”并缩短代码: $ 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 funct
$ 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
$
int符号(inti){
如果(i>0)返回1;
如果(i==0)返回0;
return-1;//i0)?1:((i您的sign()
函数效率不高。请尝试此操作
int sign(int i) {
return (i>0) ? 1 : ((i<0)?-1:0);
}
int符号(inti){
返回值(i>0)-(i<0);
}
来源:在这种情况下,我会选择解决方案:
int sign(int i) {
return (i > 0) - (i < 0);
}
int符号(inti)
{
如果(i>0)
返回1;
else如果(i==0)
返回0;
其他的
return-1;//ielse
子句不是“杂波”,它们是一种更明显的表达你意图的方式。这是一个优雅的解决方案,因为这是一个计算符号的解决方案,回答有关警告的问题会更好吗?@romandas:删除警告的解决方案已经包含在另外两个答案中,因此我没有再提及它们;而且,在使用我的解决方案时n、 警告也会消失!代码的效率肯定是编译器的一个特点,而不是代码。与其求助于这种依靠布尔数作为整数的奇怪概念的黑客,我喜欢代码,它清楚地表达了它的意图。不要用坏代码修复编译器错误。就像补充一句,如果你真的需要位旋转的话nt,用实际的符号位来做点什么怎么样?@John:把整数当作布尔值可能会很奇怪,但这是用C编程时必须习惯的事情之一;是的,我会称一个没有分支的单语句解决方案比一个有分支的三语句解决方案更有效……他为什么不自己计算符号呢?这不是一个标准函数。是的,Rob;我收回我的反对意见。嗯……O5是一个虚假的优化级别。GCC没有告诉我。Drat!我想知道我是否还有测试代码?GCC目前支持6个优化级别:-O0
(默认,无优化),-Os
(针对大小进行优化),然后是-O1
,-O2
,和-O3
。还有-Ofast
,我认为它目前相当于-O3-ffast math
。输入任何大于3的数字都会将优化级别设置为-O3
,因此您使用的是一个有效的优化设置,与所说的相同-O3
。尽管第一个版本更大,但可能速度更快,因为-O3
愿意用大小换取速度。不太可能,但大小并不能说明全部情况。也可能是文件中留下的一些符号导致了“更多行”由于有两个额外的符号,程序的版本将更大。您可以尝试使用-s
链接,以查看这是否消除了任何差异。
int sign(int i) {
return (i > 0) - (i < 0);
}
int sign(int i)
{
if (i > 0)
return 1;
else if (i == 0)
return 0;
else
return -1; // i<0
}
Unoptimized Optimized (-O5)
if 166 110
?: 150 98
>-< 122 98