初识 C 语言(2)

目录

一、sigined 和 unsigned

C 语言使用关键字 signed 和 unsigned 修饰整型和字符型,signed 是有符号型,表示该类型既可以表示正数又可以表示负数,而 unsigned 是无符号型,只能表示 0 和正数。对于 int 类型,默认是有符号的,也就是 signed int,只是一般 signed 都省略不写。

1. unsigned

无符号类型所能表示的范围是有符号类型的两倍,当涉及的值没有负数是,就可以使用无符号类型的变量。该变量的声明如下:

c 复制代码
// unsigned 类型声明
unsigned int a = 10;
unsigned long b = 20';

就是在原来声明的基础前加上 unsigned 关键字。第一条语句也可以省略 int,如下:

c 复制代码
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 ,然后进行了浮点数除法。

相关推荐
叶浩成5207 分钟前
vue2+a-table——实现框选选中功能——js技能提升
开发语言·前端·javascript
luky!8 分钟前
算法--解决二叉树遍历问题
开发语言·python·算法
《源码好优多》11 分钟前
基于Java Springboot校园共享单车
java·开发语言·spring boot
HenCoder23 分钟前
【泛型 Plus】Kotlin 的加强版类型推断:@BuilderInference
android·java·开发语言·kotlin
清灵xmf1 小时前
为什么 Vue3 封装 Table 组件丢失 expose 方法呢?
开发语言·前端·javascript·封装·eltable
神仙别闹1 小时前
基于JAVA实现的(GUI)坦克大战游戏
java·开发语言·游戏
凡人的AI工具箱1 小时前
15分钟学 Go 第 54 天 :项目总结与经验分享
开发语言·人工智能·后端·算法·golang
小春学渗透2 小时前
DAY110代码审计-PHP框架开发篇&ThinkPHP&版本缺陷&不安全写法&路由访问&利用链
开发语言·安全·web安全·php
奈葵2 小时前
C语言字符函数和字符串函数
c语言·开发语言
OKkankan2 小时前
单链表算法题(数据结构)
c语言·数据结构·数据库·c++·算法