注解二:字面量、左值右值

Warning

在部分代码中,我会省略例如 int main() #include <stdio.h> 这样的“框架”代码。

字面量 #

先看代码:

#include <stdio.h>

int main() {
    int a = 5;
    double b = 5;
    int c = 2;

    return 0;
}

其中,像552这样的值就被成为字面量。如果硬要说给字面量说个看法,那么就是:数值和写出来的字符是同一个值,比如说写作1值也是1,写成小数2.5的值也是2.5

字面量的类型 #

当然字面量也有类型,比如说5int类型,2.5double类型,1.75ffloat类型,'a'char类型等等。

单浮点与双浮点字面量 #

通常写小数的时候,默认是double类型,比如说2.5double类型的字面量。

如果要写单精度浮点的字面量,应该写做2.5f

左值与右值 #

现在,你已经学会 C 语法中两个最基本的部分了:变量、字面量,以及声明变量赋值变量的语句。

比如下面这个:

int a = 5;
int b = a;
int b = 3;

尝试抽象出来语法,会是这样

类型 变量 = 字面量;
类型 变量 = 变量;
类型 变量 = 字面量;

类型 变量 = 变量;类型 变量 = 字面量; 是否能合成一种语法?从语义的角度去想,这两个语句都是讲一个值赋值到一个变量里,合并是合理的,所以我们可以合并成:类型 变量 = 值; 这样的形式。

这个值在等号右边,将其定义为右值,而等号左边的变量则成为左值

等等,变量到底是左值还是右值?

答案是都是!左值和右值不是冲突的,而是就像在英语中有的单词既可以当名词,也可以同时当形容词那样“属于”的关系。

对于字面量,字面量只属于右值;而对于变量,变量既是左值,也是右值。

所以赋值语法可以写成简单的两句话:

数据类型 左值 = 右值; // 声明并赋值
左值 = 右值; // 赋值

现在可能看不出这样定义有什么好,但在后面,你会遇到更多可以被分成左值和右值的语法元素,在那时你就可以轻松地把那个元素带进赋值语句了。

比如说实际上赋值表达式(你可以暂时理解成c=2这样不带分号结尾的赋值)可以作为右值,值的内容是赋值的结果,我们可以写成这样:

#include <stdio.h>

int main() {
    int c = 0;
    int a = c = 2;   

    printf("a = %d\nc = %d", a, c);

    return 0;
}

int a = c = 3; 这里的 c = 2 就是作为右值,值的内容是2,这个值又赋值给了a,所以a的值也是2,而由于是赋值表达式,所以c的值也是2