C++ 个字符数据类型的用途是什么?为什么不直接使用字符串?
What's the purpose of the char data type in C++? Why not just use strings?
我看不到使用为单个字符保留的单引号的意义。那么,什么时候使用的?即char a = 'a';
来自JavaScript和PHP,我习惯于为整个字符串使用单个引号,但是在得知C 中的字符保留单个引号后,我很想知道为什么?您为什么需要一个字符?
php和javaScript是在相当高的水平上运行的语言。这意味着基本类型本质上只是几种不同类型,其实现隐藏在实际脚本引擎中的一组功能中。
c和c ,以及大多数其他低级语言都会暴露更多的"机器运作方式"。c中的字符串是字符的序列。如果您想处理字符串,则需要能够处理其组件,即char
。当您想构建字符串,比较字符串的内容等时,一个字符就会有用。自然,对于C 中的正常字符串操作,您将使用std::string
,然后像脚本语言一样,字符串的大多数方面实际上代表的人隐藏在std::string
类实施中,因此您实际上不需要关心它。但是,如果您要"查看" std::string
,它将迟早或更晚,成为char *
,它是一个指向一个内存的指针,其中包含一系列字符,单个char
元素。
人们可以看一下它从"准备好的大型乐高"到只有小块可以使用的。您仍然可以构建相同的东西,但是它需要更多的作品,并且需要更多的构建努力。您赢得的是灵活性和速度。对于处理器,char
真的很容易处理,在该处理器中,PHP中的一个字符仍表示为字符串 - 恰好是一个元素。因此,在跟踪该字符串的位置,存储的位置,它的时间等等,因为语言中的功能并不能区分单个字符和巨质体的字符串。
C的目的,并且在很大程度上也是C ,是密切代表硬件。因此,您的基本类型更接近实际的硬件表示形式,这是您需要了解C和C 的更多信息。不幸的是,涵盖所有这些都将远远超出一个答案。您将需要为自己提供一本好的C和/或C 书。
要更快,更有效地运行事物,您必须学习如何使用更少的空间。当您拥有'a'
时,这实际上是一个数字(请参阅ASCII表),但是当您获得"a"
时,它是2个字符{'a',' '}
的数组。零是知道何时结束字符串,因为计算机不确定字符串何时结束。您是否要在JavaScript中添加一个长度属性,以直接知道字符串的长度?您使用更多可能不需要的空间。不知何故,您必须区分这两个值才能运行有效的代码。首先,学习C/C ,您实际上学习了如何在计算机的低级别上工作,并且比通过学习PHP/JavaScript/Ruby/Python的了解更多。C 比更高级别的编程语言更可定制。
javascript和php是脚本语言,而C (尤其是其前身C)是相当低的本地本地本地的编程语言,您必须考虑如何将变量存储在内存中。
char a = 'a';
创建 8位长数字变量,该变量可以保存字符值(ASCII代码),并将字符a
的值放入其中。因此char a = 97;
也做相同的工作。
const char* s = "a";
创建 null终止字符串是一个 array ,带有两个元素:字符 a
的值和终止的 0
字符(只有数字 0
或字符 ' '
)。*
意味着我们创建一个指向数组的指针。它的类型是const char
,因为它包含字符串文字是常数。我们可以使用const char s[2] = { 97, 0 };
或const char s[2] = { 'a', ' ' };
。
顺便说一句,单引号不是仅保留给单个字符的。您可以将一些字符放入单引号。查看在多个字符上使用时单引号在C 中会做什么?
语言C 从语言C继承的标量类型。因此,您应该获得有关C 或C的好书以获取详细信息。
类型char
是数字类型。这是一个可以旧角色的整数。它通常是签名的,但可以用签名或未签名的前缀覆盖。另外,可以在编译器上配置签名。'A'
字面定义了一个与字符A。
" a"字符串是char的数组,并且终止为零。在示例中,您有两个字节'a',' '
。当您使用文字时,编译器将地址作为pointer
传递给数组。该指针可以分配给指针变量
char *s = "A";
或传递到功能
foo("A");
此外,当您获得char数组的含义时,您都可以掌握所有指针算术。
edit 数字字面'a'和char数组" a"是const对象。很明显,您不能将任何内容分配给
之类的数字'a' = 23; // wrong!
当您将文字分配到变量时,您可以更改以后变量。
但是,当您将指针存储在指针变量中时,它是非法的,当您尝试修改char数组时,您会得到未定义的行为:
char *s = "A";
*s = 'B'; // try to change the first byte of the char array, causes undefined behavior.
表达这是很好的样式,可以使用指针用于const char变量:
const char *s = "A";
*s = 'B'; // compiler diagnostic says: not allowed
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为什么不递增?(构造函数)
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- 为什么 C 样式字符串的工作空指针检查不?
- 为什么<string>字符串对象需要 #include 而不是字符串文本?
- 为什么通过添加字符串文字和char初始化时,为什么不打印字符串
- C++字符串为什么不能用作字符数组
- C++ 个字符数据类型的用途是什么?为什么不直接使用字符串?
- 为什么不能将 int(表示 ASCII 字符)转换为 std::字符串,而没有大括号环绕在 int 周围?
- 为什么不允许我将函数返回 const char* 的结果分配给 char*,bt 可以将字符串文字(常量)分配给 cha
- 为什么对字符串使用 "t" 而不是 "<press TAB>"?
- 为什么不能将字符串文本传递给使用模板参数的函数?
- 为什么不能在 if 条件下比较两个字符串?
- 为什么不能将字符串添加到组合框?VS C++
- 为什么不允许复制字符串流
- 为什么对字符串字面值的decltype不产生数组类型