C++ 掉期在哪里进行更改?

C++ 掉期在哪里进行更改?,c++,swap,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*)

此代码:

#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);
}
#包括
静态无效交换(无符号字符a、无符号字符b)
{
无符号字符t=a;
a=b;
b=t;
}
int main()
{
常量无符号bgr=0x0000FF;
交换(((无符号字符*)&bgr)[0],((无符号字符*)&bgr)[2]);
printf(“0x%06X\n”,bgr);
}
输出:

0x0000FF


交换在哪里进行更改?

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);
}

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


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

您正在尝试修改
bgr
<代码>bgr是
常量
。修改
const
变量是未定义的行为。这可以在许多方面表现出来,你不能依赖于任何特定的行为。了解平台上发生了什么的一个好方法是查看生成的汇编代码。

阅读main中的@juanchopanza:References和no return语句。在我看来不像C。@BenjaminLindley你说得对。我被
swap
call的参数弄糊涂了。为什么要修改const是未定义的行为而不是禁止的行为?@user3123061使其未定义给了编译器一些余地来做它认为合适的事情。为了被禁止,编译器必须能够检测到介于困难和不可能之间的所有不同可能性。
$ g++ -Wall foo.cpp ; ./a.out 
0xFF0000