初识 C 语言(2)

ops/2024/10/21 19:52:47/

目录

  • 一、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.ppmy.cn/ops/124179.html

相关文章

Android blueprint/microfactory/microfactory.bash源码分析

build_go负责编译相关源码为二进制文件,而build_go内部使用的是microfactory工具,可以按其字面意思理解为是微工厂:生产二进制文件。 # 用于构建和运行使用 microfactory 工具的 Go 代码 # Set of utility functions to build and run go co…

游离的 HEAD 如何解决

简介 问题描述:使用 IDEA 在提交代码时,禁止提交 如何解决:迁出分支再提交,最后合并到 main 或 master 上 如何解决

vulnhub-Web Developer 1靶机

vulnhub:Web Developer: 1 ~ VulnHub 导入靶机,放在kali同网段,扫描 靶机在192.168.114.129,扫描端口 有网站服务,访问 没什么东西,扫目录 真不少,访问一下,也只是一些普通的Wordpr…

【RabbitMQ高级——过期时间TTL+死信队列】

1. 过期时间TTL概述 过期时间TTL表示可以对消息设置预期的时间,在这个时间内都可以被消费者接收获取;过了之后消息将自动被删除。RabbitMQ可以对消息和队列设置TTL。 目前有两种方法可以设置。 第一种方法是通过队列属性设置,队列中所有消…

EdgeNAT: 高效边缘检测的 Transformer

EdgeNAT: Transformer for Efficient Edge Detection 介绍了一种名为EdgeNAT的基于Transformer的边缘检测方法。 1. 背景与动机 EdgeNAT预测结果示例。(a, b):来自BSDS500的数据集的输入图像。(c, d):对应的真实标签。(e, f):由EdgeNAT检测到的边缘。(e)显示了由于颜色变化…

Stable Diffusion绘画 | 如何做到不同动作表情,人物角色保持一致性(上篇)

由于 SD 具有强大的可控性,在固定人物角色方面,SD 是远超 MJ 的, 其中最好用,也是最优先的方法就是训练一个自己专属的角色模型,例如之前使用秋叶训练器得到的 LoRA模型。 另外,如果不想自己训练模型的话…

重学SpringBoot3-集成Redis(三)之注解缓存策略设置

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(三)之注解缓存策略设置 1. 引入 Redis 依赖2. 配置 RedisCacheManager 及自定义过期策略2.1 示例代码:自定…

PostgreSQL学习笔记九:事务详解

在PostgreSQL中,事务(TRANSACTION)是一个重要的概念,旨在确保数据库操作的完整性和一致性。事务是一个逻辑单位,包含一系列数据库操作,这些操作要么全部成功,要么全部失败。事务的主要特性可以用…