此代码:
#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
交换所做的更改在哪里?
答案 0 :(得分:5)
您正在尝试修改bgr
。 bgr
是const
。修改const
变量是未定义的行为。这可以通过多种方式表现出来,而且您不能依赖任何特定的行为。了解平台上发生的事情的一个好方法是查看生成的汇编代码。
答案 1 :(得分:3)
bgr
为const
。我的猜测是你通过尝试交换它的第一个和最后一个字节来调用未定义的行为。删除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
,则不会进行优化。