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.060'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
uU
unsigned(无符号)
1234U
lL
long(长整型)
1234L
llLL
long long(长长整型)
1234LL
ulUL
unsigned long
1234UL
ullULL
unsigned long long
1234ULL
luLU
unsigned long(与 UL 相同)
1234LU
lluLLU
unsigned long long(与 ULL 相同)
1234LLU

2. 浮点数字面值

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

// 小数写法:
3.14

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

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

后缀
类型
示例
无后缀
double(默认类型)
3.14
fF
float
3.14F
lL
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"