g++ 说道: 警告: 语句对移位位运算符无效

g++ says: warning: statement has no effect for shift bits operators

提问人:Akronix 提问时间:3/27/2014 更新时间:3/27/2014 访问量:3954

问:

我正在实现 alkhwarizmi 算法。
这是对的,但我的 g++ 编译器不喜欢移位运算符:>> 和 << 或者我做错了什么。
当我编译它时,我得到以下输出:

> g++ -Wall  -std=c++0x -o "Al-khwarizmi algorithm.o" "Al-khwarizmi algorithm.cpp" (in directory: /home/akronix/workspace/Algorithms)
> Al-khwarizmi algorithm.cpp: In function ‘int alkhwarizmi(int, int)’: Al-khwarizmi algorithm.cpp:31:9: warning: statement has no effect
> [-Wunused-value] Al-khwarizmi algorithm.cpp:34:9: warning: statement
> has no effect [-Wunused-value] Compilation finished successfully.

这是我的代码:

int alkhwarizmi(int x, int y)
{
    int sum = 0;
    while (x>0)
    {
        if (x%2)
            sum+=y;
        //y *= 2;
        y << 1;
        cout << y <<endl;
        //x /= 2;
        x >> 1;
        cout << x <<endl;
    }
    return sum;
}

如果我使用带注释的语句(简单的乘法和除法),一切正常。

C G++ 位移

评论

2赞 Michael Burr 3/27/2014
只是一个评论:如果你把这种转变作为一种学习练习,那很好。但是,如果您尝试“优化”乘法或除法,请不要这样做。如果代码的目的是对数字进行乘法或除法,请使用乘法或除法运算符。让您的代码表达您的代码的意图。编译器通常可以决定一个班次是否非常有效。
1赞 Akronix 3/28/2014
但是,当乘法或除以 2 比移位更有效时?
1赞 Michael Burr 3/28/2014
编译器会将乘法或除以 2 编译为移位。请参阅此: stackoverflow.com/q/10681375/12711 此外,编译器将优化比乘法或除以 2 的幂更复杂的情况: stackoverflow.com/a/1168616/12711 底线:如果您要乘法或除法,请使用这些运算符,并让编译器在适当的情况下进行移位和加法的转换。

答:

15赞 taocp 3/27/2014 #1
 y << 1;

应该是

 y <<= 1; //^^equals y = y << 1;

以下声明中的相同问题:

x >>1; //^^same issue should be x >>= 1;