当前位置: 首页 > article >正文

初识 C 语言(2)

目录

  • 一、sigined 和 unsigned
    • 1. unsigned
  • 二、数据类型的取值范围
  • 三、变量的分类
    • 1. 局部变量
    • 2. 全局变量
    • 3. 全局变量和局部变量名称冲突
  • 四、算数操作符
    • 1. 加法操作符(+)
    • 2. 减法操作符(-)
    • 3. 乘法操作符(\*)
    • 4. 除法操作符(\/)
    • 5. 取余操作符
  • 五、赋值操作符(=)和复合赋值
    • 1. 赋值操作符
    • 2. 复合赋值
  • 六、单目操作符(++)、(--)、(+)、(-)
    • 1. 自增运算符(++)
    • 2. 自减运算符(--)
    • 3. 正号(+)和负号(-)
  • 七、强制类型转换

一、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 ,然后进行了浮点数除法。


http://www.kler.cn/a/331101.html

相关文章:

  • PCA降维MATLAB代码解释及应用场景
  • 【WRF模拟】如何得到更佳的WRF模拟效果?
  • Redis——数据过期策略
  • LSTM实现天气模型训练与预测
  • Vue3 Suspense:处理异步渲染过程
  • 决策树python实现代码1
  • CF2018C Tree Pruning 题解
  • C--编译和链接见解
  • 中安未来 OCR—— 开启高效驾驶证识别新时代
  • 微服务实战——ElasticSearch(保存)
  • [C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过
  • OpenJudge | Binary Tree
  • kafka发送消费核心参数与设计原理详解
  • 《pyqt+open3d》open3d可视化界面集成到qt中
  • cloud-(Nacos)--注册中心原理-服务注册-服务发现
  • C# Blazor Server 调用海康H5Player播放摄像头画面
  • STM32 实现 UDP 广播通信
  • 从零到一:编写你的第一个PHP API
  • Spring Boot项目中使用MyBatis
  • 利用vue-capper封装一个可以函数式调用图片裁剪组件
  • 在 Qt 项目中使用 spdlog 的全攻略
  • 【硬件模块】SG90舵机模块
  • Veritus netbackup 管理控制台无法连接:未知错误
  • 【力扣 | SQL题 | 每日三题】力扣1264, 1113, 1098, 1082
  • CSP-J 2023 T1小苹果 T2公路
  • 一、Spring Boot集成Spring Security之自动装配