gpt4 book ai didi

c++ - 多字符字面理解错误

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:29 24 4
gpt4 key购买 nike

我以为我知道 MSVC 2010 如何处理多字 rune 字,直到:

int main(int argc, char* argv[]) 
{
int a = '\' ';
int b = '\'/ ';
int c = '\'/> ';
int d = '\'/>\x20'; // same as c supposedly
int e = 'ABC\x20';
printf("%X\n%X\n%X\n%X <-- what?\n%X\n", a,b,c,d,e);
return 0;
}

27202020
272F2020
272F3E20
20272F3E <-- what?
41424320

如果您在 IDE 的监 window 口中键入:

'\'/>\x20'

它打印出:

272F3E20

这是我所期望的。那么...这是怎么回事!?

我找到了 this在网上,所以我认为这是一个编译器错误。我猜它可能无法修复,因为它可能会破坏旧代码?

编辑:我很满意这是一个不会改变的怪癖或错误。它似乎只在多字 rune 字中使用了 1 个以上的转义序列时才会发生。

解决方法如下:

('\'/>' << 8) | '\n'

最佳答案

这似乎是一个已知的 MSVC 编译器“特性”。

C++ 标准 n3797 S2.14.3/1 说:

A multicharacter literal, or an ordinary character literal containing a single c-char not representable in the execution character set, is conditionally-supported, has type int, and has an implementation-defined value.

所以 MSVC 当然可以做到这一点,并声称它是“实现定义的”而不是错误。

如果这是我的决定,我可能会说“不修复”。破坏现有代码的风险远远高于做任何有用的事情的好处,并且可以通过 Stack Overflow 上有趣的问答轻松解决。

引用:参见 http://www.tech-archive.net/Archive/VC/microsoft.public.vc.language/2004-09/0079.html .


如果您希望可靠地组合等效值,您有两种选择,这两种选择会根据字节顺序产生相反的结果。

您可以使用算术运算(移位和掩码)来生成整数值:

 '\'' | ('/' << 8) | ('>' << 16) | ('\x20' << 24)

或者您可以使用字符串和转换操作来生成类似字符串的整数值:

*(int*)"\"/>\x20"

根据评论,根据其编写方式,最后一种技术可能会导致生成错误代码。该字符串必须到达某个地方(在运行时)并且它将以空值终止。主要理由是它可以避免对字节序敏感的#defines 和预处理的需要。

另见这个问题:How to write a compile-time initialisation of a 4 byte character constant that is fully portable

关于c++ - 多字符字面理解错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375274/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com