7. 字面值

字面值(Literal) 是直接在代码中表示的固定值(常量),它们的值和类型在编译时就已确定。字面值用于表示常量数据,例如整数、浮点数、字符或字符串等。

常量

常量是指在程序中永远不会改变的量,在整个程序中不允许修改。

在下面的程序中

#include <stdio.h>

int main(int argc, char *argv[]) {
    int age;      // 声明一个整型变量,初始值不确定。
    float price = 0.0;  // 声明一个浮点型变量,初始值为0.0
    int score1, score2 = 60; // 声明两个整型变量
    char gender = 'F';  // 声明一个字符型变量,初始值为'F'(值为70)。
                        // 字符 'F' 后续讲解。
    printf("age: %d, price: %f, score1: %d, score2: %d, gender: %d\n",
        age, price, score1, score2, gender
    );
    return 0;
}

其中的 0.0、60、'F'和 return 后面的 0 都是字面值。

C 语言中的字面值类型有:

  1. 整数字面值
  2. 浮点数字面值
  3. 字符字面值
  4. 字符串字面值

1. 整数字面值

整数字面值有三种写法,即:十进制写法、八进制写法 和 十六进制写法,如:。

// 十进制写法:
100    -1     0

// 八进制写法,0开头。
0177

// 十六进制写法,以 0x 或 0X 开头,后跟 0-9, A-F或a-f(表示 10 ~ 15)
0x1    0X2    0xa    0xA     0xFF    0XFFFFFFFF

上述写法中,无论是 十进制写法 还是 十六进制写法,在计算机内存存储时都是用整数(int 类型)进行存储的。

在 C 语言中,整数字面值不但有值,而且还有存储这些值的方式方法,即:数据类型。默认整数字面值的数据类型都是整数。如果我们要告诉编译器这个类型不是整数,则需要再整数字面值的后面添加后缀来表示不同的类型。

整数字面值后缀写法如下表所示:

后缀
类型
示例
无后缀
int(默认类型)
1234或 0x1234
u 或 U
unsigned(无符号)
1234U
l 或 L
long(长整型)
1234L
ll 或 LL
long long(长长整型)
1234LL
ul 或 UL
unsigned long
1234UL
ull 或 ULL
unsigned long long
1234ULL
lu 或 LU
unsigned long(与 UL 相同)
1234LU
llu 或 LLU
unsigned long long(与 ULL 相同)
1234LLU

2. 浮点数字面值

浮点数字面值有两种写法,即:小数写法、指数写法。如:

// 小数写法:
3.14

// 指数写法:
0.314E1 或 0.314e1  // 表示 0.314 x 10 的 1 次方

浮点数字面值后缀写法如下表所示:

后缀
类型
示例
无后缀
double(默认类型)
3.14
f 或 F
float
3.14F
l 或 L
long double
3.14L

3. 字符字面值

字符型字面值用单引号(')括起来的单个字符。默认返回整数数据类型。如:

// '' 中间放入一个 ascii 字符
'A'     // 值为 65(十进制)
' '     // 空格,值为 32(十进制)
'0'     // 字符0️,值为 48(十进制)

// 转义序列写法:使用 \ 开头
'\n'    // 换行符,值为 10(十进制)(详见ASCII编码表)
'\t'    // 制表符,值为 9(十进制)

// 八进制转义序列写法:一个 \ 后跟 1~3个八进制数字
'\0'    // 空字符,值为 0 (ASCII 0)
'\12'   // 换行符'\n',值为 12(八进制)、10(十进制)
'\101'  // 字符 'A',值为101(八进制)、65(十进制)、

// 十六进制转义序列写法:一个 \x 后跟 1~2个十六进制数字
'\x0'    // 空字符,值为 0 (ASCII 0)
'\x41'   // 字符 'A',值为101(八进制)、65(十进制)、
'\xA'    // 换行符,值为 10(十进制)
'\xFF'   // 值为 255(十进制),字符型字面值的最大值。

字符型字面值默认返回整数数据类型。

4. 字符串字面值

字符串字面值用英文的双引号(")括起来的字符序列。默认返回 const char const * 类型(后面会讲),如:

"Hello"   // 字符串,末尾自动加 '\0',长度为 6 个字节。
"Hello\tWorld\n"     // 包含转义字符的字符串。

字符串字面值实际上是 char 数组,并以 \0(空字符)结尾。

关于字符串的内容后面会讲

总结:

字面值 是 C 语言中直接表示固定值的语法结构,编译器会根据其形式推断数据类型。理解字面值有助于正确使用常量数据。

练习:

下面这些字面值是那种类型的数据。

3.14     3.14f    '0'     200     200U    200L

200UL    1LL     6.18E-1   2.71828E0F     "hello"