3.C 语言变量

简介: 3.C 语言变量

三、C 语言变量

1.变量

变量(variable)可以理解成一块内存区域的名字。通过变量名,可以引用这块内存区域,获取里面存储的值。由于值可能发生变化,所以称为变量,否则就是常量了。

2.变量名

变量名在 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

另外,两个下划线开头的变量名,以及一个下划线 + 大写英文字母开头的变量名,都是系统保留的,自己不应该起这样的变量名。

3.变量的声明

C 语言的变量,必须先声明后使用。如果一个变量没有声明,就直接使用,会报错。每个变量都有自己的类型(type)。声明变量时,必须把变量的类型告诉编译器。

int height;

上面代码声明了变量 height ,并且指定类型为 int (整数)。如果几个变量具有相同类型,可以在同一行声明。

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

注意,声明变量的语句必须以分号结尾。一旦声明,变量的类型就不能在运行时修改。

4.变量的赋值

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 就会报错。


5.变量的作用域

作用域(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 ,编译器就会报错。

6.数据类型

C 语言的每一种数据,都是有类型(type)的,编译器必须知道数据的类型,才能操作数据。所谓“类型”,就是相似的数据所拥有的共同特征,那么一旦知道某个值的数据类型,就能知道该值的特征和操作方式。

基本数据类型有三种:字符(char)、整数(int)和浮点数(float)。复杂的类型都是基于它们构建的。

7.字符类型

字符类型指的是单个字符,类型声明使用 char 关键字。

char c = 'B';

上面示例声明了变量 c 是字符类型,并将其赋值为字母 B 。

C 语言规定,字符常量必须放在单引号里面。在计算机内部,字符类型使用一个字节(8位)存储。C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。每个字符对应一个整数(由 ASCII 码确定),比如 B 对应整数 66 。字符类型在不同计算机的默认范围是不一样的。一些系统默认为 -128 到 127 ,另一些系统默认为 0 到255 。这两种范围正好都能覆盖 0 到 127 的 ASCII 字符范围。只要在字符类型的范围之内,整数与字符是可以互换的,都可以赋值给字符类型的变量。

char c = 66;
// 等同于
char c = 'B';

上面示例中,变量 c 是字符类型,赋给它的值是整数66。这跟赋值为字符 B 的效果是一样的。两个字符类型的变量可以进行数学运算。

char a = 'B'; // 等同于 char a = 66;
char b = 'C'; // 等同于 char b = 67;
printf("%d\n", a + b);//输出133

上面示例中,字符类型变量 a 和 b 相加,视同两个整数相加。占位符 %d 表示输出十进制整数,因此输出结果为133。单引号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义

char t = '\'';

上面示例中,变量 t 为单引号字符,由于字符常量必须放在单引号里面,所以内部的单引号要使用反斜杠转义。

这种转义的写法,主要用来表示 ASCII 码定义的一些无法打印的控制字符,它们也属于字符类型的值。

\a :警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。

\b :退格键,光标回退一个字符,但不删除字符。

\f :换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于 \v 。

\n :换行符。

\r :回车符,光标移到同一行的开头。

\t :制表符,光标移到下一个水平制表位,通常是下一个8的倍数。

\v :垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。

\0 :null 字符,代表没有内容。注意,这个值不等于数字0。

转义写法还能使用八进制和十六进制表示一个字符。

\nn :字符的八进制写法, nn 为八进制值。

char c = 'B';
char c = 66;
// 等同于
char c = 'B';
char a = 'B'; // 等同于 char a = 66;
char b = 'C'; // 等同于 char b = 67;
printf("%d\n", a + b); // 输出 133
char t = '\'';

xnn :字符的十六进制写法, nn 为十六进制值。

char x = 'B';
char x = 66;
char x = '\102'; // 八进制
char x = '\x42'; // 十六进制

上面示例的四种写法都是等价的。

目录
相关文章
|
5天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
31 12
|
4月前
|
存储 C语言
C语言数据类型、变量和运算符以及printf相关问题
C语言数据类型、变量和运算符以及printf相关问题
|
14天前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
31 5
|
2月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
49 1
|
2月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
2月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
2月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
2月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
3月前
|
存储 C语言
【C语言基础考研向】02 数据类型-常量-变量
本文介绍了编程中的基本概念,包括数据类型分类、常量与变量的定义及使用。首先概述了四大类数据类型:基本类型(整型、浮点、字符型)、构造类型(数组、结构体)、指针类型和空类型。接着阐述了常量与变量的区别及命名规则,并详细说明了整型、浮点型和字符型数据的特点与应用。最后总结了常见的易错点,如字符串与字符常量的区别及浮点数的默认输出格式。
|
3月前
|
存储 传感器 物联网
结合物联网开发探讨C语言的变量
在物联网(IoT)开发中,C语言的变量起着至关重要的作用。由于物联网设备资源有限,C语言的高效性和对硬件的直接控制使其成为开发嵌入式系统的首选。