在部分代码中,我会省略例如 int main() #include <stdio.h> 这样的“框架”代码。
字面量 #
先看代码:
#include <stdio.h>
int main() {
int a = 5;
double b = 5;
int c = 2;
return 0;
}
其中,像5、5、2这样的值就被成为字面量。如果硬要说给字面量说个看法,那么就是:数值和写出来的字符是同一个值,比如说写作1值也是1,写成小数2.5的值也是2.5。
字面量的类型 #
当然字面量也有类型,比如说5是int类型,2.5是double类型,1.75f是float类型,'a'是char类型等等。
单浮点与双浮点字面量 #
通常写小数的时候,默认是double类型,比如说2.5是double类型的字面量。
如果要写单精度浮点的字面量,应该写做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。