前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(2)----数据类型、变量以及操作符

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

作者头像
Skrrapper
发布2024-06-18 15:30:40
260
发布2024-06-18 15:30:40
举报
文章被收录于专栏:技术分享技术分享

1.数据类型介绍

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

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

首先介绍内置类型。

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

注意,布尔类型是在后来才创造出的判断真假的类型,在此之前都是以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)单目操作符:++、--、+、-

在运算中,还有一类操作符叫做单目操作符。它的对象只有一个操作数。

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

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

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

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

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

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

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

7.赋值操作符 =

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

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

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

9.强制类型转换

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

10.printf和scanf

printf

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

scanf

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

它们二者都定义在头文件<stdio.h>中。

占位符

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

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

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

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

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

占位符对应的类型

printf

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

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

printf总是显示正负号。

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

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.赋值忽略符

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.数据类型介绍
  • 2.数据类型的长度以及其计算方式
  • 3.关于signed和unsigned
  • 4.数据类型的取值范围
  • 5.变量
  • 6.算术操作符
    • (1)双目操作符
      • (2)单目操作符:++、--、+、-
      • 7.赋值操作符 =
      • 8.复合赋值+=,-=...
      • 9.强制类型转换
      • 10.printf和scanf
        • printf
          • scanf
          • 11.赋值忽略符
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档