在应用了位移运算符后,为什么我的变量没有改变?

时间:2011-06-16 05:14:30

标签: c++ bitwise-operators

int main()
{
    int i=3;
    (i << 1);
    cout << i; //Prints 3
}

由于左移一位,我预计会得到6分。为什么不起作用?

7 个答案:

答案 0 :(得分:19)

因为位移运算符返回一个值。

你想要这个:

#include <iostream>

int main()
{
     int i = 3;
     i = i << 1;
     std::cout << i;
}

班次操作员不会“就地”转移。你可能会想到另一个版本。如果他们这样做,就像许多其他C ++二元运算符一样,那么我们就会发生非常糟糕的事情。

i <<= 1; 

int a = 3;
int b = 2;
a + b;    // value thrown away
a << b;   // same as above

答案 1 :(得分:10)

你应该使用<<=,否则价值就会丢失。

答案 2 :(得分:4)

您需要将i分配给移位的值。

int main()
{
    int i=3;
    i <<= 1;
    cout << i; //Prints 3
}

或者,您可以使用&lt;&lt; =作为赋值运算符:

i <<= 1;

答案 3 :(得分:3)

因为您没有将答案分配回i。

i = i << 1;

答案 4 :(得分:3)

您没有将表达式(i << 1);的值分配回i

尝试:

i = i << 1;

或(同):

i <<= 1;

答案 5 :(得分:2)

您需要使用i将值重新分配回i<<=1(使用“左移和分配运算符”)

答案 6 :(得分:2)

<强>原因: i << 1生成一个中间值,该值不会保存回变量i

// i is initially in memory
int i=3;

// load i into register and perform shift operation,
// but the value in memory is NOT changed
(i << 1);

// 1. load i into register and perform shift operation
// 2. write back to memory so now i has the new value
i = i << 1;

出于您的意图,您可以使用:

// equal to i = i << 1
i <<= 1;