C 语言变量
变量是程序可操作的存储区的名称。C 中每个变量都有特定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中。
运算符可应用于变量上。
C 语言变量命名规则
变量的名称可以由字母、数字和下划线字符组成。
变量必须以字母或下划线开头。
C 语言中的变量是大小写敏感的。大写字母和小写字母是不同的,
我们在前一章节中学习了基本类型。
因为基本类型可以用来修饰变量,所以有以下几种基本的变量类型
类型 | 描述 |
---|---|
char | 通常是一个字节(八位)。这是一个整数类型。 |
int | 对机器而言,整数的最自然的大小。 |
float | 单精度浮点值。 |
double | 双精度浮点值。 |
void | 表示类型的缺失。 |
C 语言也允许定义各种其他类型的变量,比如枚举、指针、数组、结构、共用体等等
这将会在后续的章节中进行讲解,本章节我们先讲解基本变量类型。
C 语言中的变量定义
变量定义就是告诉编译器在何处创建变量的存储,以及如何创建变量的存储。
变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:
type variable_list;
-
type 必须是一个有效的 C 数据类型,可以是
char
、w_char
、int
、float
、double
、bool
或任何用户自定义的对象, -
variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号(,)分隔。
下面是几个有效的声明:
int i, j, k; char c, ch; float f, salary; double d;
int i, j, k; 声明了变量 i、j 和 k,这指示编译器创建类型为 int 的名为 i、j、k 的变量。
C 语言中的变量初始化
变量可以在声明的时候被初始化(指定一个初始值),简称定义变量。
初始化器由一个等号,后跟一个常量表达式组成,如下所示:
type variable_name = value;
下面列举几个实例:
extern int d = 6, f = 8; // d 和 f 的声明与初始化 int d = 7, f = 17; // 定义并初始化 d 和 f byte z = 28; // 定义并初始化 z char x = 'z'; // 变量 x 的值为 'x'
不带初始化的定义:带有静态存储持续时间的变量会被隐式初始化为 NULL(所有字节的值都是 0) 其他所有变量的初始值是未定义的。
C 中的变量声明
变量声明向编译器保证变量以指定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。
变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
变量的声明有两种情况:
-
一种是需要分配存储空间的。例如:
int a
在声明的时候就已经建立了存储空间。 -
另一种是不需要分配存储空间的,通过使用
extern
关键字声明变量名而不定义它。 例如:extern int a
其中变量 a 可以在别的文件中定义的。
除非有 extern
关键字,否则都是变量的定义
extern int i; //声明,不是定义 int i; //声明,也是定义
范例
接下来我们看个示例,了解下变量的声明和定义以及初始化。
/** * file: variables.c * author: 简单教程(www.twle.cn) */ #include <stdio.h> // 变量声明 extern int a, b; extern int c; extern float f; int main () { /* 变量定义 */ int a, b; int c; float f; /* 初始化 */ a = 17; b = 28; c = a + b; printf("value of c : %d \n", c); f = 68.0/13.0; printf("value of f : %f \n", f); return 0; }
编译和执行上面的代码,输出结果如下:
value of c : 45 value of f : 5.230769
C 中的左值(Lvalues)和右值(Rvalues)
C 中有两种类型的表达式:
-
左值(lvalue): 指向内存位置的表达式被称为左值(lvalue)表达式。 左值可以出现在赋值号的左边或右边。
-
右值(rvalue): 术语右值(rvalue)指的是存储在内存中某些地址的数值。 右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。 数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。
下面是一个有效的语句:
int g = 20;
但是下面这个就不是一个有效的语句,会生成编译时错误:
10 = 20;