Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是「;“字符”;字符串形式';什么是定义?_C_Language Lawyer - Fatal编程技术网

C 什么是「;“字符”;字符串形式';什么是定义?

C 什么是「;“字符”;字符串形式';什么是定义?,c,language-lawyer,C,Language Lawyer,C11将“字符串”定义为: 字符串是以和结尾的连续字符序列 包括第一个空字符。§7.1.1 1 它先前将“字符”定义为: 3.7字符 〈摘要〉 用于组织、控制或表示数据的一组元素的成员 3.7.1 字符 单字节字符 〈C〉 适合字节的位表示 3.7.2 多字节字符 表示扩展字符集成员的一个或多个字节的序列 3.7.3 宽字符 由wchar\u t类型的对象表示的值,能够表示任何字符 在当前区域设置中 问题:在“字符串”的定义中使用了什么“字符”的定义: 3.7中的“字符” 3.7.1中的“字符”

C11将“字符串”定义为:


字符串是以和结尾的连续字符序列 包括第一个空字符。§7.1.1 1

它先前将“字符”定义为:

3.7字符
〈摘要〉 用于组织、控制或表示数据的一组元素的成员

3.7.1 字符
单字节字符
〈C〉 适合字节的位表示

3.7.2 多字节字符
表示扩展字符集成员的一个或多个字节的序列

3.7.3 宽字符
由wchar\u t类型的对象表示的值,能够表示任何字符 在当前区域设置中

问题:在“字符串”的定义中使用了什么“字符”的定义:
3.7中的“字符”
3.7.1中的“字符”

还是别的什么?

字符串是
char
类型的连续数据序列
“字符”一词有两种含义,抽象和实用。
从抽象的角度来看,我们首先必须定义“字符集”的概念,以便稍后转到3.7并说“一组元素中的一员…”。
“字符”的定义符合另一个标准:ISO/IEC 2382-1

在那里,您可以分析一大串与“信息表示”相关的术语

我的简短回答:在“字符串”的定义中,“字符”对应于c11.3.7.1。
解释如下:

摘要中的字符

符号是人类的一种知识习俗。
因此,“A”的抽象符号是一种惯例,我们使用它来识别不同的“图形”,如A、A、A,它们都是“相同”的东西(比如一条信息)。
然后,信息由一组(抽象)字符的有序和有限序列表示。
接下来,您需要对这些抽象符号进行编码,以使其在信息系统(计算机)中的表示成为可能。
通常,这是通过定义整数(称为代码点)与给定集合中相应字符之间的一对一对应关系来实现的。
编码模式是一种将一组字符与某些数字(代码点)关联的方式。
此编码可以从一个系统更改为另一个系统(“A”在EBCDIC中的编码与在ASCII中的编码不同)。
最后,我们将一个“图形”与每个字符+代码点相关联,即一个书面表示,最终可以打印或显示在屏幕上。
图形的形状可以根据字体设计而改变,因此定义术语“字符”并不是一个好的起点

C中的字符

在3.7.1中。似乎C11指的是“字符”的另一种含义,是“单字节字符”的简写形式。它所说的代码点(即与“给定集合的抽象字符”关联的整数)正好适合1个字节。
在这种情况下,我们需要定义字节
在C语言中,字节是一个信息存储单元,由n位的有序序列组成,其中n是大于或等于8的整数(当然,通常是8),通过检查
中的常量
字符位
,可以找到其值

有些数据类型的大小正好是1字节:
char、unsigned char、signed char

无符号字符
的值范围正好是0…2^n-1,其中n是
字符位

char
的值范围与
signed char
unsgined char
一致,但C11没有说明其中哪一个对应于
char

此外,在任何情况下,必须将类型
char
视为不同于
signed char
unsigned char

现在,字符串是
char
类型的对象序列

为什么使用字符?

本标准定义了字符的
char

(6.2.5.3)

声明为char类型的对象足够大,可以存储基本类型的任何成员 执行字符集。如果基本执行字符集的成员存储在 char对象,其值保证为非负。如果任何其他字符存储在 对于char对象,结果值由实现定义,但应在范围内 可以在该类型中表示的值的集合

字符串

现在,C中的字符串是一个连续的(单字节)字符序列,以空字符结尾,在C中总是0。
可以用抽象的方式再次理解该定义,但是在7.1.1.1中,文本讨论了字符串的地址,因此必须理解“字符串”是内存中的对象。
因此,“字符串”对象是一个连续的“字节”序列,每个字节包含一个字符的代码点

这源于一个事实,即一个“字符”正好适合1个字节。
它在C中由
char
类型的数组表示,其最后一个元素是0

多字节字符

“多字节”的定义很复杂。
它是指一些使用可变字节数表示(抽象)字符的特殊编码模式。
为了正确处理多字节字符集,您需要有关执行字符集的信息。
然而,即使您有一个多字节字符,它仍然在内存中表示为一个字节序列

那意味着