交换的变化在哪里?

时间:2014-05-01 21:27:27

标签: c++ swap

此代码:

#include <stdio.h>

static void swap(unsigned char& a, unsigned char& b)
{
    unsigned char t = a;
    a = b;
    b = t;
}

int main()
{
    const unsigned bgr = 0x0000FF;
    swap(((unsigned char*) &bgr)[0], ((unsigned char*) &bgr)[2]);
    printf("0x%06X\n", bgr);
}

输出:

0x0000FF

交换所做的更改在哪里?

3 个答案:

答案 0 :(得分:5)

您正在尝试修改bgrbgrconst。修改const变量是未定义的行为。这可以通过多种方式表现出来,而且您不能依赖任何特定的行为。了解平台上发生的事情的一个好方法是查看生成的汇编代码。

答案 1 :(得分:3)

在这种情况下,

bgrconst。我的猜测是你通过尝试交换它的第一个和最后一个字节来调用未定义的行为。删除const会导致我平台上的实际交换:

#include <stdio.h>

static void swap(unsigned char& a, unsigned char& b)
{
    unsigned char t = a;
    a = b;
    b = t;
}

int main()
{
    unsigned bgr = 0x0000FF;
    swap(((unsigned char*) &bgr)[0], ((unsigned char*) &bgr)[2]);
    printf("0x%06X\n", bgr);
}

现在编译并运行:

$ g++ -Wall foo.cpp ; ./a.out 
0xFF0000

答案 2 :(得分:2)

因为您将bgr声明为const,所以您已成为编译器优化的牺牲品。不是将实际变量传递给printf,而是传递一个常数值。

如果尚未声明变量const,则不会进行优化。