文字和常量在C中是同一个概念吗?

文字和常量在C中是同一个概念吗?,c,C,文字和常量在C中是同一个概念吗? 它们在用法上有什么不同吗?不太一样。常量变量(与宏中定义的常量相反)是具有专用存储空间的实际变量,因此可以获取它们的地址。你不能接受文字的地址 编辑:对不起,各位,看来我弄错了。文字和常量在C中是截然不同的。可以说,C中的文字代表占用内存的未命名对象(文字通常是左值),而常量代表不一定占用内存的值(可能命名)(常数是右值) “Classic”C(C89/90)只有一种文本:字符串文本。C中没有其他类型的文本。C99另外引入了所谓的复合文本 同时,常量一词是指显式

文字和常量在C中是同一个概念吗?
它们在用法上有什么不同吗?

不太一样。常量变量(与宏中定义的常量相反)是具有专用存储空间的实际变量,因此可以获取它们的地址。你不能接受文字的地址

编辑:对不起,各位,看来我弄错了。

文字和常量在C中是截然不同的。可以说,C中的文字代表占用内存的未命名对象(文字通常是左值),而常量代表不一定占用内存的值(可能命名)(常数是右值)

“Classic”C(C89/90)只有一种文本:字符串文本。C中没有其他类型的文本。C99另外引入了所谓的复合文本

同时,常量一词是指显式值,如
1
2.5f
0xA
's'
。此外,枚举成员在C中也被识别为常量

同样,由于C中的文字是左值,所以可以获取并使用它们的地址

const char *s = "Hello";
char (*p)[6] = &"World";
int (*a)[4] = &(int []) { 1, 2, 3, 4 };
因为常量是右值,所以不能获取它们的地址

const
关键字声明的对象在C术语中不被视为常量。它们不能用于需要常量值的地方(如大小写标签、位字段宽度或全局静态变量初始化)

<> P.S.注意到C中的相关术语与C++的术语有很大的不同。在C++中,术语文字实际上覆盖了C中已知的大部分作为常量。在C++中,代码> const < /Cord>对象可以形成常量表达式。人们有时试图将C++术语强加给C,这常常导致混淆。

(另请参见)

C标准(特别是ISO/IEC 9899,第二版,1999-12-01)本身没有定义“文字”,因此这不是C的具体概念。我发现“文字”有三种用法,如下所述

首先,字符串文字(或形式语法中的“字符串文字”)是引号内的一系列字符,可以选择前缀为“L”(这使其成为宽字符串文字)。这无疑被称为文字,因为字符串中的每个字符都代表它自己:源文本中的“b”表示“b”在字符串中。(与源文本中作为数字而不是字符串的字符“34”相比,程序中的值是34,而不是字符“3”和“4”。)这些文本的语义在6.4.5的第4和第5段中定义。本质上,相邻的文本是关联的(
“abc”“def”
被转换成
“abcdef”
),追加一个零字节,结果用于初始化静态存储持续时间数组。因此,字符串文本将生成一个对象

其次,复合文字是一种更复杂的构造,用于为结构创建值。“复合文字”是一个不幸的名称,因为它根本不是文字。也就是说,文字的源文本中的字符不一定完全代表它们自己。事实上,复合文字甚至不是常量。复合文字可以包含在运行时计算的表达式,包括函数调用

第三,在6.1第1段中,标准指出“文字词和字符集成员”用粗体字表示。这种“文字”的用法是描述标准本身,而不是用C语言描述事物;这意味着标准中的“goto”表示字符串“goto”在C语言中

除了字符串文字,我不认为“文字”在C中是一个特殊的概念

然而,“常数”是一个重要的概念

首先,有一些简单的常量,如“34”、“4.5f”和“b”。后者是一个字符常量;虽然用字符写入,但它有一个整数值。常量包括整数常量(十进制、八进制和十六进制)、浮动常量(十进制和十六进制)、字符常量和枚举常量。枚举常量是在“枚举”构造中指定的名称

第二,6.6中定义了常量表达式。常量表达式可以在转换(编译时)而不是运行时进行计算,并且可以在常量可能位于的任何位置使用。6.6为常量表达式设置了某些规则。例如,如果
x
是静态数组,如
static int x[8]所声明;
,然后
&x[(int)(6.8*.5)]
是一个常量表达式:它是x的元素3的地址(您很少使用浮点对数组进行索引,但我将其包含在示例中,以显示它作为常量表达式的一部分是允许的。)


关于“const”:该标准似乎没有明确地将const限定对象定义为常量。相反,它说,试图通过左值(如取消引用的指针)修改使用const限定类型定义的对象对于非常量限定类型,行为是未定义的。这意味着不需要C实现来强制常量对象的恒定性。(另外,请注意,有一个指向常量的指针并不意味着指向的对象是常量,只是取消引用的指针不是可修改的左值。可能有一个指向同一对象的单独指针不是常量限定的。例如,在
int i;int*p=&i;const int*q=p;
中,q是指向常量int的指针,但i不是co。)nst对象,p是指向相同int的指针,尽管它是指向int的指针,没有常量。)

另外注意:
静态常量
变量的存储空间可以被编译器完全省略,因此您实际上不会因为使用常量变量而支付“罚款”。“您不能获取文本的地址”。t