目录
一、sigined 和 unsigned
C 语言使用关键字 signed 和 unsigned 修饰整型和字符型,signed 是有符号型,表示该类型既可以表示正数又可以表示负数,而 unsigned 是无符号型,只能表示 0 和正数。对于 int 类型,默认是有符号的,也就是 signed int,只是一般 signed 都省略不写。
1. unsigned
无符号类型所能表示的范围是有符号类型的两倍,当涉及的值没有负数是,就可以使用无符号类型的变量。该变量的声明如下:
// unsigned 类型声明
unsigned int a = 10;
unsigned long b = 20';
就是在原来声明的基础前加上 unsigned 关键字。第一条语句也可以省略 int,如下:
unsigned a = 10;
该语句和 unsigned int a = 10 是等价的。
二、数据类型的取值范围
每种数据类型都有属于它自己的取值范围,也就是存储数值的最大值和最小值的区间。我们可以通过下面文件中的常量进行查看:
limits.h 头文件中说明了整型类型的取值范围。
float.h 头文件中说明了浮点数类型的取值范围。
下面是整数类型的最大最小值常量:
• SCHAR_MIN , SCHAR_MAX :signed char 的最⼩值和最⼤值。
• SHRT_MIN , SHRT_MAX :short 的最⼩值和最⼤值。
• INT_MIN , INT_MAX :int 的最⼩值和最⼤值。
• LONG_MIN , LONG_MAX :long 的最⼩值和最⼤值。
• LLONG_MIN , LLONG_MAX :long long 的最⼩值和最⼤值。
• UCHAR_MAX :unsigned char 的最⼤值。
• USHRT_MAX :unsigned short 的最⼤值。
• UINT_MAX :unsigned int 的最⼤值。
• ULONG_MAX :unsigned long 的最⼤值。
• ULLONG_MAX :unsigned long long 的最⼤值。
代码演示:
其他整型类型和上述代码类似,只要把后面的常量名和前面的格式改掉就行。
三、变量的分类
在 C 语言中,变量按照其作用域的范围来分,分为局部变量和全局变量。简单来说,作用域就是你能够使用这个变量的范围。
1. 局部变量
(1)作用域
在 C 语言中局部变量是在函数内部或者代码块内部定义的变量,且其作用域仅限于定义他的函数内部或者代码块。如下代码:
这是在代码块中定义的变量 a,出了代码块,该变量就不能使用,因为它的作用域只有定义它的代码块。
(2)生命周期
局部变量存储在内存中的栈区,其生命周期为其所在的代码块或者函数。通常进入该代码块或函数时,该局部变量被创建,出该代码块或者函数时,该局部变量被销毁。
(3)初始化
局部变量若不初始化,则其值为随机值。若使用未初始化的局部变量,编译器(visual studio 2022)通常会报错。如下代码:
2. 全局变量
(1)作用域
全局变量通常定义在所有函数之外,全局变量的作用域为通常为整个程序,当然如果在其他文件中想使用该全局变量,需要使用关键字 extren 进行声明。如下代码:
上述代码分别在主函数 main() 和自定义函数 print() 中使用了全局变量 a。
上述代码演示了当前文件若想使用其他文件的全局变量时,需要使用关键字 extern 进行声明。
(2)生命周期
全局变量存储在内存中的静态区,其生命周期为整个程序。全局变量程序启动时被创建,在程序结束时被销毁。
(3)初始化
全局变量若不初始化,则编译器将其设置为 0。如下代码:
3. 全局变量和局部变量名称冲突
若全局变量和局部变量名称冲突,那么局部变量会隐藏全局变量。如下代码:
当全局变量和局部变量同名时,在两个变量的作用域重叠部分会优先使用局部变量。所以,我们应该尽量让不要编写全局变量和局部变量名称冲突的代码。
四、算数操作符
在 C 语言中,常见的算数操作符有:加法操作符(+),减法操作符(-),乘法操作符(*),除法操作符(/)和取余操作符(%)。
1. 加法操作符(+)
加法操作符就是把左边的操作数和右边的操作数相加,然后把该结果存放在一个临时变量中,不改变原操作数。如下代码:
如果是一个整数和浮点数进行加法运算,那么该整数会转换为该浮点数的类型,然后再进行运算。
2. 减法操作符(-)
减法操作符就是左边的操作数减去右边的操作数,然后把结果存储在一个临时变量中,不改变原操作数。如下代码:
如果是一个整数和浮点数进行减法运算,那么该整数会转换为该浮点数的类型,然后再进行运算。
3. 乘法操作符(*)
乘法操作符就是左边的操作数乘以右边的操作数,然后把结果存储在一个临时变量中,不改变原操作数。如下代码:
如果是一个整数和浮点数进行乘法运算,那么该整数会转换为该浮点数的类型,然后再进行运算。
4. 除法操作符(/)
倘若除法操作符中有一个运算对象是浮点数,那么进行浮点数的除法。否则进行整数除法。
(1)浮点数除法
(2)整数除法
这里的结果是 0,因为整数除法只取整数,舍弃余数。4 除以 5 得 0 余 4,所以结果为 0。
5. 取余操作符
首先,取余操作符的两个运算对象都必须是整数。其运算结果为左边操作数对右边操作数进行整数除法的余数。如:4 除以 5 得 0 余 4,所以 4 % 5 = 4。如下代码:
五、赋值操作符(=)和复合赋值
1. 赋值操作符
赋值操作符的作用是把右边操作数的值赋值给左边的操作数,且可以连续赋值,其运算顺序是从右往左,其结果为左边运算对象赋值后的值。如下代码:
上述代码在赋值过程中先计算 c = 5,然后该表达式的值为赋值后的 c,即 5 然后继续 b = c,然后 a = b。
2. 复合赋值
复合赋值其实就是赋值操作符和其他操作符的结合,如:+=、-=、/= 等。简单来说,a += b 其实就相当于 a = a + b。其他复合赋值操作符均是如此。如下代码:
六、单目操作符(++)、(–)、(+)、(-)
1. 自增运算符(++)
自增运算符有两种形式,一种是前置自增,如:++a。一种是后置自增,如:a–。前置形式先把变量 a 的值加 1,再使用变量 a 的值;而后置形式是先使用 a 的值然后再把 a的值加 1。如下代码:
可以看到,无论是前置形式还是后置形式,自增运算符最终的效果都是让该变量的值加 1,只是前置形式使用自增后的值,而后置形式使用自增前的值。
2. 自减运算符(–)
和自增运算符一样,只是自减运算符的最终效果是减 1 而已。如下代码:
3. 正号(+)和负号(-)
运算符正号(+)对正负值没有影响,是一个完全可以省略的运算符,但是写了也不会报错。如下代码:
可以看到,上述代码中的正号(+)对 a 的值的正负并没有任何影响。
运算符负号(-)对该值的正负取反,若 a 为正,则 -a 为负,若 a 为负,则 -a 为正。如下代码:
七、强制类型转换
强制类型转换的格式为:(目标类型)代转换对象。把代转换对象的值强制转换为目标类型。如下代码:
上述代码第一次进行 a / b 进行的是整数除法,但是第二次进行 a / b 之前,a 的值 10 被强制类型转换为 double 类型的 10.0 ,然后进行了浮点数除法。