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 の使用をやめますか? 最後に偽の return 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);
}

出典:ビットいじりハック

于 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 句を 2 つ追加します。これは、生成されるオブジェクト コードに違いが生じるためではなく、コードをより対称的にするためです。

私はいくつかの実験をしました。三項演算子を 2 回使用する 1 行バージョンでは、長い方と同じコードが生成されると思っていました。ただし、Solaris 10 (SPARC) で GCC v4.3.2 を使用してテストすると、三項演算子のバージョンは一貫して「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 に答える