https://cppquiz.org/quiz/question/249
#include <iostream>
using namespace std;
int main() {
int a = '0';
char const &b = a;
cout << b;
a++;
cout << b;
}
我知道这里的答案,但想知道为什么这不是实现定义的......即依赖于机器?
如果您在一台大端机器上运行此代码,然后重新编译并在一台小端机器上运行它会怎么样?
当您尝试在 cout 中打印文字字符“ ”时,它不会打印“0”。
您没有将引用绑定到
a
的第一个字节,而是将右侧评估为 int&
并保持 0x30
,此引用将转换为临时 char
0x30
并且引用为绑定到这个临时字符,而不是 a
。
内存布局在任何时候都不重要。将
int
转换为 char
定义为 mod 256
(假设无符号 8 位 char
)。确保实现这一点取决于实施。
当然,在非 8 位原生大端架构上,转换可能涉及将最高字节移至最低位置,以便将寄存器用作 true
char
,但这些是其他人需要处理的技术细节。
您将
b
绑定到 a
的临时副本(或者更确切地说,a
的低位字节),而不是 a
本身。 a
到 char
的隐式转换会创建一个临时值。
如果您想查看由于字节顺序而引起的更改,则需要使用指针(使用适当的强制转换和取消引用运算符):
#include <iostream>
int
main()
{
int a = '0';
char const* b = reinterpret_cast<char const*>( &a );
std::cout << *b << std::endl;
++ a;
std::cout << *b << std::endl;
return 0;
}