C语言(2)----数据类型、变量以及操作符

简介: C语言(2)----数据类型、变量以及操作符

1.数据类型介绍

数据类型是c语言中用来描述生活中各种数据的一种分类,例如年龄,体重等等。

image.png

可见,数据类型包含内置类型和自定义类型,而前者是官方提供的几种可使用类型,而后者则是可以用来给编写者创造出自己所要的数据类型的基本模板。

首先介绍内置类型。
image.png
image.png
image.png

由此可见,字符型对应字符,整型对应整数,浮点型对应小数,布尔类型判断真假。需要注意这些类型都是函数,是用来表达出所要的数据的,而非数据本身。

注意,布尔类型是在后来才创造出的判断真假的类型,在此之前都是以0代表假,非0代表真来执行。

2.数据类型的长度以及其计算方式

每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。

而sizeof就是用来计算类型长度(返回值)的,它是一个关键字也是操作符,单位是字节(byte)。

字节是计算机科学中倒数第二小的单位,第一小的是比特(bit),我们所说的硬盘容量是40gb、80gb、100gb,这里的b指是的byte也就是“字节”。1byte=8bit,而在计算机语言中,1bit就相当于一个进制位,即1or0.所以1byte相当于8个进制位。

再返回到sizeof,sizeof 操作符的操作数可以是类型,也可是变量或者表达式。

sizeof 运算符的返回值,C 语⾔只规定是⽆符号整数,并没有规定具体的类型,⽽是留给系统⾃⼰去决定, sizeof 到底返回什么类型。不同的系统中,返回值的类型有可能是 unsigned int ,也有可能是 unsigned long ,甚⾄是 unsigned long long , 对应的 printf() 占位符分别是 %u 、 %lu 和 %llu 。这样不利于程序的可移植性。 C 语⾔提供了⼀个解决⽅法,创造了⼀个类型别名 size_t ,⽤来统⼀表⽰ sizeof 的返 回值类型。对应当前系统的 sizeof 的返回值类型,可能是 unsigned int ,也可能是 unsigned long long 。

而size_t在打印的时候,使用%zd来表示。

·sizeof(类型)

·sizeof 表达式

可以看出二者的区别是是否加括号。

注意:

sizeof后的表达式不计算,也就是说sizeof计算出的结果类型长度,而不是根据表达式算出来的答案,例如若a=2(a是两个字节)那么再写

int b=2

sizeof(a+b=3)

那么计算出来的结果是2而不是1,因为计算的是类型长度。

3.关于signed和unsigned

C 语⾔使⽤ signed 和 unsigned 关键字修饰字符型和整型类型

这里的signed表示该类型带有正负号整数

而unsigned代表该类型是非负整数,即0和正整数

而对于int类型,默认带有正负号,所以此时signed便可以省略。

注意的是,由于signed是可以负数的,所以在内存方面相同大小的unsigned会比signed大一倍(内存没有负数)

而我们都知道正负符号都是放在第一位的,所以我们用从左往右第一位即最高位来表示正负

4.数据类型的取值范围

对于数据类型是有它们自己的取值范围的,我们知道了范围后可以根据这个标准来选择更合适的数据类型

• 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 的最⼤值。

在我们的计算机中,limits.h ⽂件中说明了整型类型的取值范围。 float.h 这个头⽂件中说明浮点型类型的取值范围。

5.变量

了解清楚了类型,我们使⽤类型做什么呢?类型是⽤来创建变量的。 什么是变量呢?C语⾔中把经常变化的值称为变量,不变的值称为常量。

从第一点我们可知数据类型是用来描述生活中各种数据的。而不同的数据类型也要对应实际生活不同的事物。

例如,年龄是整数,故用int。而温度有小数,故用float。

变量又分为两种。

• 全局变量:在⼤括号外部定义的变量就是全局变量 全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。

• 局部变量:在⼤括号内部定义的变量就是局部变量 局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。

在大括号内的定义的变量,即局部变量是无法被全局变量识别的。

而在大括号内使用数据类型的时候,全局变量是可以被识别的。

可以把全局变量想象成共享单车,而局部变量就是自己家上锁的自行车,当全局变量和局部变量冲突的时候,即名字重复的时候,会优先识别局部变量,就好比当你家的自行车和共享单车款式相同,你当然更喜欢能上锁的自己家那一辆。

全局变量和局部变量在内存中存储在哪⾥呢? 内存中有三个区域:栈区、堆区、静态区。

(1) 局部变量是放在内存的栈区

(2)全局变量是放在内存的静态区

(3) 堆区是⽤来动态内存管理的

6.算术操作符

在c语言中也会有加减乘除这样的算术方式,而且它与正常的加减乘除差别有,却不是很大。

在c语言中,像+,-,*,/等等的符号,被称为算术操作符,也叫做运算符。它们是用来进行一系列计算的符号,而在它们左右两边的数字或者未知数被称为操作数,就像:a+b,a与b是操作数,而+就是算术操作符。

(1)双目操作符
什么是双目操作符呢,就是说符号两边都有操作数,也就是像加减乘除。加法和减法无需多说,它与正常运算是一模一样的;而对于乘除法,在计算机上是没有乘号和除号,所以用*和/来代替。

需要注意的是,除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。

也就是说,像3/2,原本应该得到1.5,但是由于只取整数,所以答案是1(这个规则不会因类型而改变,也就说尽管类型是float浮点数,得到也是整数)

而如果想要得到小数,符号两端的操作数就必须至少要有一个是小数,也就是如果要得到1.5,那么就必须是3.0/2或者3/2.0或者3.0/2.0 可以理解为为了得到同类型的答案,就必须要有一个操作数来作示范。

请注意,除了加减乘除,也不要忘了%这个重要的角色。运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。至于为什么不能用于浮点数,因为它会把余出的数给表示出来,自然就不存在小数

负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。

(2)单目操作符:++、--、+、-
在运算中,还有一类操作符叫做单目操作符。它的对象只有一个操作数。

++:这个双加号是自增操作符,也就是对于操作数这个对象进行自增,而它又分为前置++和后置++。
image.png

像上述这样,就是++的含义。

--:而对于--,与++的运算规则是一样的,只不过变成了-14

+,-:注意,这里的符号不是加减,而是正负号

运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。

运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。

注意:这里的正数的可以省略,可以理解为占一个字符位的空白符,所以+-a就是 -a。

7.赋值操作符 =

在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。赋值操作符 = 是⼀个随时可以给变量赋值的操作符。可以理解为设未知数等于某个确定值或者另一个未知数,类比方程思想。

8.复合赋值+=,-=...

我们经常对某个操作数进行自增自减等操作,也就是复合赋值,这时候复合赋值符能起到方便运算的作用。
image.png

9.强制类型转换

当前类型和后类型不统一的时候,我们运行编译器就会报警告,这时候我们可以通过给后面的操作数或字符加上(要转换的类型),强制使其转换成前类型。

image.png

10.printf和scanf

printf

printf是print format的简称,意思就是打印格式化,定制输出⽂本的格式。它的作用就是将参数文本输出到屏幕上显示。

scanf

scanf是将变量的值输出在屏幕上。其实对于这两个函数就可以理解为,printf是将输入的内容打印出去,也就是输出,而scanf是将想要输出的内容打到到计算机中,也就是输入。这样就不难理解了。

它们二者都定义在头文件中。

占位符

占位符,顾名思义,就是这个符号可以被其他值代替。占位符第一个符号永远是%,而第二个符号就是所对应的类型,例如%d,%s等等。

可以将占位符理解为方程中的未知数x,y,z等等,而它们可以是任何数,字符等等,比如有%d个苹果,%d可以是123456789等等。

输出⽂本⾥⾯可以使⽤多个占位符。就比如在%s上有%d个苹果,%s可以是桌子,%d可以是3.

存在多个占位符时,按照从左往右的顺序写,
image.png

需要注意,占位符所对应的必须是同一个类型。而对于什么样的占位符对应什么类型,以下举例。

占位符对应的类型
image.png

printf
printf() 可以定制占位符的输出格式。

printf() 允许限定占位符的最⼩宽度。
image.png
image.png

printf总是显示正负号。
image.png

printf可以指定输出部分字符串。
image.png

scanf
scanf() 函数⽤于读取⽤⼾的键盘输⼊。

程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。 ⽤⼾输⼊数据、按下回⻋键后, scanf() 就会处理⽤⼾的输⼊,将其存入变量。

scanf() 的语法跟 printf() 类似。

但是有不同的地方,对于变量必须输入&运算符,因为它传递的不是值,而是地址,即将变量的地址指定用户输入的值。而这里的地址也可以理解为变量在程序上的位置。scanf() 处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。

scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。也就是说当用户输入数据的时候,即使两个数据间空格甚至换行,都不会影响函数的解读。但是要注意有个特例就是%c,%c 不忽略空⽩字符,总是返回当前第⼀个字符,⽆论该字符是否为空格.如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,就能跳过所有空格。

另外还有个特殊的占位符是%s,它代表的类型是字符串,它从第一个空格开始识别直到下一个空格停止,也就是说这个占位符输出的程序是不会有空格的,并且会在末尾存储一个空字\0.

scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。这样就不会数组溢出的风险。

scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。 如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量 EOF。这句话的意思就是,在测试你输入了几个数的时候,你输入几个数,它读取到的就是几个数,但是如果发生了错误或者已经读取到结尾了,比如它要你输入三个数但你一个都不输入,那么它就会报错返回EOF,注意EOF在返回值中以-1表示。

11.赋值忽略符

image.png
image.png

综合上述板书可知,只要加入赋值忽略符,就算你输入其他格式,也不会报错。

目录
相关文章
|
6月前
|
C语言
C语言中条件操作符的应用
最后,条件操作符是个超级英雄,但不是每个代码问题都需要一个超级英雄来解决。一定要在适当的时候适度的使用它,那么它将成为你的编程工具箱中的一件强力工具。
321 75
|
10月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
8月前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
1154 1
一文彻底搞清楚C语言的数据类型和变量
|
9月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
236 1
|
10月前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
327 12
|
10月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
453 8
|
10月前
|
存储 网络协议 C语言
【C语言】位操作符详解 - 《开心消消乐》
位操作符用于在位级别上进行操作。C语言提供了一组位操作符,允许你直接操作整数类型的二进制表示。这些操作符可以有效地处理标志、掩码、位字段等低级编程任务。
421 8
|
10月前
|
C语言
【C语言】逻辑操作符详解 - 《真假美猴王 ! 》
C语言中有三种主要的逻辑运算符:逻辑与(`&&`)、逻辑或(`||`)和逻辑非(`!`)。这些运算符用于执行布尔逻辑运算。
541 7
|
10月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
166 5
|
12月前
|
存储 缓存 C语言
【c语言】简单的算术操作符、输入输出函数
本文介绍了C语言中的算术操作符、赋值操作符、单目操作符以及输入输出函数 `printf` 和 `scanf` 的基本用法。算术操作符包括加、减、乘、除和求余,其中除法和求余运算有特殊规则。赋值操作符用于给变量赋值,并支持复合赋值。单目操作符包括自增自减、正负号和强制类型转换。输入输出函数 `printf` 和 `scanf` 用于格式化输入和输出,支持多种占位符和格式控制。通过示例代码详细解释了这些操作符和函数的使用方法。
267 10