一零一六、C语言白菜入门--变量

117 阅读7分钟

变量(varible)可以理解成⼀块内存区域的名字。通过变量名,可以引⽤这块内存区域,获取⾥⾯存储的值。由于值可能发⽣变化,所以称为变量,否则就是常量了。

目录

变量名

变量的声明

变量的赋值

基本数据类型

变量的作用域


变量名

变量名在 C 语⾔⾥⾯属于标识符(identifier),命名有严格的规范。

  • 只能由字⺟(包括⼤写和⼩写)、数字和下划线( _ )组成。
  • 不能以数字开头。
  • ⻓度不能超过63个字符。

下面列举一些无效变量名:

$zj

j**p

2cat

Hot-tab

tax rate

don't

上⾯示例中,每⼀⾏的变量名都是⽆效的。

变量名区分⼤⼩写, star 、 Star 、 STAR 都是不同的变量。 并⾮所有的词都能⽤作变量名,有些词在 C 语⾔⾥⾯有特殊含义(⽐如 int ),另⼀些词是命令(⽐如 continue ),它们都称为关键字,不能⽤作变量名。另外,C 语⾔还保留了⼀些词,供未来使⽤,这些保留字也不能⽤作变量名。下⾯列举一些C 语⾔主要的关键字和保留字。

auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, inline, int, long, register, restrict, return, short, signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while

另外,两个下划线开头的变量名,以及⼀个下划线 + ⼤写英⽂字⺟开头的变量名,都是系统保留的,⾃⼰不应该起这样的变量名。

变量的声明

C 语⾔的变量,必须先声明后使⽤。 如果⼀个变量没有声明,就直接使⽤会报错。

变量定义的一般形式为:数据类型 变量名;

每个变量都有⾃⼰的类型(type)。

声明变量时,必须把变量的类型告诉编译器。

int height;

上⾯代码声明了变量 height ,并且指定类型为 int (整数)。

如果⼏个变量具有相同类型,可以在同⼀⾏声明。

int height, width;
// 等同于
int height;
int width;

注意,声明变量的语句必须以分号结尾。

变量⼀旦声明,变量的类型就不能在运⾏时修改。

变量的赋值

C 语⾔会在变量声明时,为它分配内存空间,但是不会清除内存⾥⾯原来的值。所以,变量⼀定要赋值以后才能使⽤。

赋值操作通过赋值运算符( = )完成。

int num;
num = 42;

上⾯示例中,第⼀⾏声明了⼀个整数变量 num ,第⼆⾏给这个变量赋值。

变量的值应该与类型⼀致,不应该赋予不是同⼀个类型的值,⽐如 num 的类型是整数,就不应该赋值为⼩数。虽然 C 语⾔会⾃动转换类型,但是应该避免赋值运算符两侧的类型不⼀致。

变量的声明和赋值,也可以写在⼀⾏。

int num = 42;

多个相同类型变量的赋值,可以写在同⼀⾏。

int x = 1, y = 2;

注意,赋值表达式有返回值,等于等号右边的值。

int x, y;
x = 1;
y = (x = 2 * x);

上⾯代码中,变量 y 的值就是赋值表达式( x = 2 * x )的返回值 2 。

由于赋值表达式有返回值,所以 C 语⾔可以写出多重赋值表达式。

int x, y, z, m, n;
x = y = z = m = n = 3;

上⾯的代码是合法代码,⼀次为多个变量赋值。赋值运算符是从右到左执⾏,所以先为 n 赋值,然后依次 为 m 、 z 、 y 和 x 赋值。

C 语⾔有左值(left value)和右值(right value)的概念。左值是可以放在赋值运算符左边的值,⼀般是变量;右值是可以放在赋值运算符右边的值,⼀般是⼀个具体的值,简单理解就是右边的值赋值给左边(从右往左看) 。这是为了强调有些值不能放在赋值运算符的左边,⽐如 x = 1 是合法的表达式,但是 1 = x 就会报错。

基本数据类型

  1. 基本数据类型
  2. 构造数据类型
  3. 指针类型
  4. 空类型

 常用的有整形,浮点型,字符型

整型数据是指不带小数的数字

  • int short int long int根据编译环境的不同,所取范围不同。
  • 其中short intlong int至少是表中所写范围, 但是int在表中是以16位编译环境写的取值范围。
  • 另外 c语言int的取值范围在于他占用的字节数 ,不同的编译器,规定是不一样。
  • ANSI标准定义int是占2个字节,TC是按ANSI标准的,它的int是占2个字节的。但是在VC里,一个int是占4个字节的。

浮点数据是指带小数的数字。

生活中有很多信息适合使用浮点型数据来表示,比如:人的体重(单位:公斤)、商品价格、圆周率等等。

因为精度的不同又分为3种(float,double,long double):

 简而言之,小数也有不同的位数,位数越多表明越精确,这时候就需要不同的精度来衡量

变量的作用域

作⽤域(scope)指的是变量⽣效的范围。C 语⾔的变量作⽤域主要有两种:⽂件作⽤域(file scope)和块 作⽤域(block scope)。

⽂件作⽤域(file scope)指的是,在源码⽂件顶层声明的变量,从声明的位置到⽂件结束都有效。

int x = 1;
int main(void) {
 printf("%i\n", x);
}

上⾯示例中,变量 x 是在⽂件顶层声明的,从声明位置开始的整个当前⽂件都是它的作⽤域,可以在这个范围的任何地⽅读取这个变量,⽐如函数main() 内部就可以读取这个变量。

块作⽤域(block scope)指的是由⼤括号( {} )组成的代码块,它形成⼀个单独的作⽤域。凡是在块作⽤域⾥⾯声明的变量,只在当前代码块有效,代码块外部不可⻅。

int a = 12;
if (a == 12) {
 int b = 99;
 printf("%d %d\n", a, b); // 12 99
}
printf("%d\n", a); // 12
printf("%d\n", b); // 出错

上⾯例⼦中,变量 b 是在 if 代码块⾥⾯声明的,所以对于⼤括号外⾯的代码,这个变量是不存在的。 代码块可以嵌套,即代码块内部还有代码块,这时就形成了多层的块作⽤域。

它的规则是:内层代码块可以使⽤外层声明的变量,但外层不可以使⽤内层声明的变量。如果内层的变量与外层同名,那么会在当前作⽤域覆盖外层变量。

{
 int i = 10;
 {
 int i = 20;
 printf("%d\n", i); // 20
 }
 printf("%d\n", i); // 10
}

上⾯示例中,内层和外层都有⼀个变量 i ,每个作⽤域都会优先使⽤当前作⽤域声明的 i 。

最常⻅的块作⽤域就是函数,函数内部声明的变量,对于函数外部是不可⻅的。 for 循环也是⼀个块作⽤域,循环变量只对循环体内部可⻅,外部是不可⻅的。

for (int i = 0; i < 10; i++)
 printf("%d\n", i);
printf("%d\n", i); // 出错

上⾯示例中, for 循环省略了⼤括号,但依然是⼀个块作⽤域,在外部读取循环变量 i ,编译器就会报错。

⽐较特殊的是, for 的循环条件部分是⼀个单独的作⽤域,跟循环体内部不是同⼀个作⽤域。

for (int i = 0; i < 5; i++) {
 int i = 999;
 printf("%d\n", i);
}
printf("%d\n", i); // ⾮法