1.写在前面
今天大年初十,今天开工了,我们今天继续来学C语言的变量相关的规则,也是C语言之父的《C程序设计语言》的神书的第二章。任何程序都是用来处理数据的,那么变量或者常量都是用来存储对应的数据的,所以我们今天就来窥探一下变量相关的规则。
2.概述
变量和常量是程序处理的两种基本数据对象。声明语句说明变量的名字及类型,也可以指定变量的初值。运算符指定将要进行的操作。表达式则把变量和常量组合起来生成新的值。对象的类型决定对象可取值的集合以及可以对该对象执行的操作。从汇编语言的角度来说,处理数据的时候,我们需要知道这个数据所在的地址,也就是对应的变量的名字,我们还需要这个数据的长度,也就是我们这儿所说的类型。
3.变量名
从汇编的角度,我们存储数据的地址具有唯一性,所以可以得出我们的变量的命名也是具有唯一性的,不然会起冲突,简单的来说这就是变量的命名规则之一。
变量命名的规则:名字是由字母和数字组成的序列,但其第一个字符必须为字母。可能有人会说为什么不用数字,数字话,会给人造成误解,误解成这个是值。(下划线"_"我们也可以看成是字母)
变量的命名尽量见名知意。同时变量的命名尽量不要和C语言的关键字相同,因为这样编译器无法区分这个是关键字还是变量。
4.数据类型及长度
数据的地址通过变量名已经表示出来,但是数据的长度我们怎么表示出来。所以C语言的提供了几种常用的类型来表示数据的长度。
我们可以通过如下的代码来查看对应的数据类型的长度,具体的代码如下:
#include<stdio.h>
#include <stdbool.h>
int main() {
printf("int型长度:%d\n", sizeof(int));
printf("short int型长度:%d\n", sizeof(short int));
printf("long int型长度:%d\n", sizeof(long int));
printf("long long int型长度:%d\n", sizeof(long long));
printf("char型长度:%d\n", sizeof(char));
printf("bool型长度:%d\n", sizeof(bool));
printf("float型长度:%d\n", sizeof(float));
printf("double型长度:%d\n", sizeof(double));
return 0;
}
运行的结果如下:
对于上面的运行的结果,我们总结出如下的表格:
类型 | 长度 |
---|---|
int | 4位 |
short int | 2位 |
long int | 8位 |
long long | 8位 |
char | 1位 |
bool | 1位 |
float | 4位 |
double | 8位 |
C语言中还有就是signed
与unsigned
两个关键字,signed
表示有符号的数,unsigned
表示无符号数,我们知道计算机中存储的数据都是二级制的数,如果这个类型是无符号的数,那么这个数的最高位就不是符号位,如果这个数是有符号的数,那么这个数字的最高位就是符号位。
5.常量
这个值在编译前就确定了,那么这个值就是常量。
long类型的常量以字母l或者L结尾。无符号常量以字母u或者U结尾。后缀ul或UL表明的是unsigned long 类型。
后缀f或F表示float类型,而后缀l或L则表示long double 类型。
带前缀0的整型常量表示它为八进制形式;前缀为0x或0X则表示它为十六进制形式。
'x’和"x"这两个的存储在计算机中是不一样的,'x’就是表示一个字符,存的是x的ASCII码值,"x"表示一个字符串,存的是x的ASCII码值+\0
6.声明
变量不可能无中生有的出来的,所以变量要使用必须先声明,那么如何声明变量呢?变量的两大要素,变量类名 变量的类型,所以我们可以知道大概的变量的声明的规则,就是定义好类型 定义好变量名。
注意:
- 默认的情况下,外部变量和静态变量都被初始化为0
- 未经显示初始化的自动变量的值为未定义值。
- 任何变量的声明都可以使用const限定符显得你。该限定符指定变量的值不能被修改。对于数组而言,const限定符指定数组所有元素的值都不能被修改。
7.算术运算符
程序的本质是对数据进行操作,那么对数据的操作肯定要进行常用的运算符操作。其中二元算术运算符包括:+、-、*、/、%
其中%是取模运算符,不能应用于float或double类型。在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符合取决于具体机器的实现,这和处理上溢或下溢的情况是一样的。
8.关系运算符与逻辑运算符
关系运算符包括下列几个运算符:>、>=、 <、 <=、 ==、 !=
逻辑运算符:&&(与)、||(或)、!(非)
关系运算符是用来判断两个变量比较的结果是否为真假,逻辑运算符是用来判断两个组合的条件的结果是否为真假。
9.类型转换
数学中3+3.0是允许的,但是在计算机中,3的类型的是int,3.0的类型是double,两种类型是不一样的,理论上这两个数是不能进行计算的,但是如果这样的话,就不科学,所以我们必须要把这两个数的类型进行统一,将int类型转换成double类型这一过程我们称之为类型转换。
自动类型转换:一般将占位少的类型转换成占位多的类型。这是一种不丢失信息的转换。
注意:C语言没有指定char类型的变量是无符号变量还是带符号变量。当把一个char类型的值转换为int类型值时候,取决与char类型值的最左一位是0还是1,如果是0的话就是正数,如果是1就是负数。
10.自增运算符与自减运算符
前缀自增或者前缀自减,后缀自增或者自减,不管自增还是自减,都是对原来的变量进行加1或者减1。前缀的运算符表示先进行自增或者自减然后进行赋值。后缀的运算符表示先进行赋值再进行自增或者自减。
例如:
int a = 5;
int c = a++; // a等于6 c等于5
a = 5;
c = ++a; // a等于6 c等于6
11.按位运算符
& 按位与(AND)
| 按位或(OR)
^ 按位异或(XOR)
<< 左移
>> 右移
~ 按位求反
所有的按位运算符都是对二进制进行操作的。
按位与运算符&经常用于屏蔽某些二进制位。
按位或运算符|常用于将某些二进制位置为0
异或的话,相同为0,不同为1
取反就是将1变成0 0变成1
左移和右移需要考虑的符号位,有些是要考虑符号位的。有些事不用考虑符号位的。
12.赋值运算符与表达式
+=
-=
*=
/=
%=
<<=
>>=
&=
^=
|=
赋值运算符:a = a+5 ----> a+=5 左右两边是等价,想必大家可以举一反三了。
13.条件表达式
expr1 ? exper2 : expr3
expr1等于真 执行expr2 expr1等于假 执行expr3
14.运算符优先级和求值次序
同一行中的各运算符具有相同的优先级,各行间从上往下优先级逐行降低。
15.写在最后
本篇博客大概的介绍了下C语言的变量的一些规则,下一篇博客主要给大家讲下控制流。