为什么字符常量/文字不能为空?
Why can't character constants/literals be empty?
在C和C++中,规则是相同的。在 C 中,
[§6.4.4.4]/2
整数字符常量是一个或 更多用单引号括起来的多字节字符,如'x'
.
C++年,
[§2.14.3]/1
字符文本是包含的一个或多个字符 在单引号中,如在'x'
中,可以选择在前面加上 字母u
、U
或L
,如u'y'
、U'z'
或L'x'
, 分别。
关键词是"一个或多个"。相反,字符串文字可以是空的,""
,大概是因为它由空终止字符组成。在 C 语言中,这会导致 char 的尴尬初始化。要么保持未初始化状态,要么使用无用的值,如 0
或 ' '
.
char garbage;
char useless = 0;
char useless2 = ' ';
在 C++ 中,如果您希望字符串文本为空,则必须使用字符串文本而不是字符文本。
(somecondition ? ' ' : '') // error
(somecondition ? " " : "") // necessary
是什么原因呢?我假设C++的理由是从C继承而来的。
原因是字符文本被定义为字符。可能有扩展允许它成为多个字符,但它需要至少是一个字符,否则它没有任何意义。这与尝试执行的操作相同:
int i = ;
如果你不指定一个值,你在那里放什么?
这是因为空字符串末尾仍包含空字符' '
,因此仍有值要绑定到变量名称,而空字符文本没有值。
字符串是以 NULL 字符 ('\0' ( 结尾的一组字符。所以一个空字符串在末尾总是有一个 NULL 字符。
但是在字符文字的情况下,没有值。它至少需要一个字符。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- std::remove() 按预期处理文字,但不能与取消引用的迭代器一起工作
- 为什么带有指针子对象的文字类类型的 constexpr 表达式不能是非类型模板参数
- C++ 不能在cout中使用向量和字符串文字
- 为什么两个字符串文字可以连接,而不能连接两个字符串变量
- clang vs gcc CRTP:constexpr 变量不能有非文字类型
- 是一个字符串文字,不能用作C++中的模板参数
- 为什么字符常量/文字不能为空?
- 为什么编译器不能用文字确定 std::max 的模板?
- 为什么我不能写入字符串文字,而我*可以*写入字符串对象?