【发布时间】:2014-02-06 05:03:12
【问题描述】:
为什么C允许使用“字符类型”访问对象:
6.5 表达式 (C)
对象的存储值只能由具有以下类型之一的左值表达式访问:
- 一种字符类型。
但 C++ 只允许 char 和 unsigned char?
3.10 左值和右值 (C++)
如果程序尝试通过以下类型之一以外的左值访问对象的存储值,则行为未定义:
- char 或 unsigned char 类型。
signed char hatred 的另一部分(引自 C++ 标准):
3.9 类型 (C++)
对于普通可复制类型 T 的任何对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,构成该对象的底层字节都可以复制到 char 或 无符号字符。如果 char 或 unsigned char 数组的内容被复制回对象,则该对象随后应保持其原始值。
并且来自 C 标准:
6.2.6 类型的表示 (C)
存储在任何其他对象类型的非位域对象中的值由 n × CHAR_BIT 位组成,其中 n 是该类型对象的大小,以字节为单位。该值可以被复制到 unsigned char [n] 类型的对象中(例如,通过 memcpy);生成的字节集称为值的对象表示。
我可以在 stackoverflow 上看到很多人说这是因为 unsigned char 是唯一保证没有填充位的字符类型,但 C99 部分 6.2.6.2 整数类型 说
signed char 不应有任何填充位
那么这背后的真正原因是什么?
【问题讨论】:
-
您能否提供这些报价的位置?
-
“仇恨”从何而来?我在这里没有看到任何问题。
-
我认为如果从问题中删除无意义的 C 比较可能会更容易阅读。
-
@Ivan:不,我们不在乎。删除它。
-
@Close vote fetish club:这怎么“不清楚”?!