为什么将字符串(数组)转换为 char 会导致小写"c"

Why does casting a string (array) to char result in a lower case "c"

本文关键字:char 字符串 数组 转换 为什么      更新时间:2023-10-16

我找不到在哪里记录将字符串转换为char会导致"c"字符:

Serial.println(char(67));  // => C
Serial.println(char(81));  // => Q
Serial.println(char('C')); // => C
Serial.println(char('Q')); // => Q
Serial.println(char("C")); // => c
Serial.println(char("Q")); // => c

"Q"实际上是一个由两个字符组成的字符数组:{ 'Q', '' }(长度为 1 的以 null 结尾的 C 字符串(,驻留在内存中的某个特定地址。

数组,显式定义或来自字符串文字并不重要,在大多数情况下会自动衰减到指针,例如,当作为函数参数传递时,取消引用它们,...——尤其是在对它们应用强制转换时!

所以这里发生的事情实际上相当于

char const* ptr = "Q";
char(ptr);

实际上,这是未定义的行为,因为char,无论是否签名,都不足以容纳指针值,因此任何事情都可能发生。在引擎盖下,代码很可能会被视为您(完全合法地(这样做:

char(unsigned char(uintptr_t(ptr)))

简单地切断最重要的三个字节。

剩下的是内存地址的最低有效字节,它匹配 99(ASCII 值 c (只是纯粹的意外,它可能是任何其他值。

字符串文本(如 "C"(是一个字符数组。 char("C")将数组转换为字符。在诸如此类的值上下文中,数组隐式衰减为指向第一个元素的指针。因此,这是从指针到整数类型的转换(字符类型是整数类型(。

除了可以表示所有指针值的此类整数类型之外,不存在从指针到整数类型的转换。因此,char("C")在任何系统上都是格式不正确的表达式,其中char不能表示所有指针值。

未诊断错误的编译器不符合标准。如果编译器成功编译了一个格式错误的程序,则完全取决于编译器的行为方式;它超出了语言标准的范围。