- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我以为我知道 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/
1.字面常量 (1)字面意思是啥就是啥,看其表示就可以知道其值和类型。 (2)有值无名,一用来初始化变量,与一种字符相关联。 #include <stdio.h>int main()
我是一名优秀的程序员,十分优秀!