在部分代码中,我会省略例如 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
。