1.数据类型介绍
C语言提供了丰富的数据类型来描述生活中的各种数据。
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道操作数据。
那么C语言的数据类型有哪些呢?下面我给大家整理了一张图。
接下来我一一介绍:
字符型:
整型
浮点型
布尔类型
C语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示假,非零值表示真。
在c99中也引入了布尔类型,是专门表示真假的。
布尔类型的使用得包含头文件<stdbool.h>,布尔类型的变量取值是:true或者false
代码演示:
各种数据类型的长度
每一中数据类型都有自己的长度,使用不同的数据累类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。
sizeof操作符
sizeof 是⼀个关键字,也是操作符,专门是用来计算sizeof操作符数的类型⻓度的,单位是字节。
sizeof操作数的操作数可以是类型,也可以是变量或者表达式。
sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
sizeof 的计算结果是 size_t 类型的,size_t是一种无符号的整型打印的时候用%zd。
C语言规定:sizeof(long) >= sizeof(int)
例:
数据类型长度
这是在VS 2022 X64 配置下输出的。
sizeof中表达式不计算
sizeof 在代码进行编译的时候,就根据表达式的类型确定了,类型的常⽤,而表达式的执行却要在 程序运行期间才能执行,在编译期间已经将sizeof处理掉了,所以在运行期间就不会执⾏表达式了。
2.signed和unsigned
C语言使用signed和unsigned关键字修饰字符型和整数类型的。
signed关键字,表示一个类型带有正负号,包含负值;
unsigned关键字,表示该类型不带有正负号,只能表示0和正整数。
对于int类型,默认是带有正负号的,也就是说int等同于signed int,所以默认情况下关键字signed一般都省略不写,写了也没问题。
int 类型也可以不带正负号,只表示非负整数。这时就必须使用关键字 unsigned 声明变量。
整数变量声明为 unsigned 的好处是,同样长度的内存能够表示的最大整数值,增大了⼀倍。
unsigned int 里面的 int 可以省略,所以上面的变量声明也可以写成下面这样。
字符类型char也可以设置signed和unsigned。
注意,C语言规定char类型是默认是否带有正负号,由当前系统决定。
这就是说,char不等同于signed char,它可能是signed char,也有可能是unsigned char。
这一点与int不同,int就是等同于signed int。
3.变量
变量创建的语法形式是这样的:
变量在创建的时候就给一个初始值,就叫初始化。
变量的分类
全局变量:在大括号外部定义的变量就是全局变量,全局变量的使用范围更广,整个工程想使用,都是有办法使用的。
局部变量:在大括号内部定义的变量就是局部变量,局部变量的使用范围是比较局限的,只能在自己所在的局部范围使用。
当局部变量和全局变量同名的时候,局部变量优先使⽤。
那全局变量和局部变量是在内存中存储在哪里呢?
一般我们在学习c、c++语言的时候,我们会关注内存中三个区域:栈区,堆区,静态区。
局部变量是存放在内存的栈区
全局变量是放在内存的静态区
堆区是用来动态内存管理的(我会在后面的博客中介绍)
4.算术操作符:+,-,*,/,%
我们在写代码的时候,一定会涉及到计算,C语言为了方便运算,提供了一系列操作符,其中有一组操作符叫:算术操作符。分别是+ - * / %,这些操作符都是双目操作符。操作符也叫运算符
+ 和 -
+ 和 - 用来完成加法和减法。
+ 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双目操作符。
*
运算符*用来完成乘法
/
运算符 / ⽤来完成除法。
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
上面示例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,而不是 1.5 。原因就在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。
如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。
%
运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。
负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
5.赋值操作符:=和复合赋值
在变量创建的时候给一个初始值叫初始化,变量创建好后,再给一个值就是赋值。
赋值操作符 = 是⼀个随时可以给变量赋值的操作符。
连续赋值
赋值操作符也可以连续赋值:
C语言虽然支持这种连续赋值,但写出的代码比容易理解,建议还是拆开来写,这样方便代码的执行细节。
这样写在调试的时候每一次赋值的细节是很方便观察的。
复合赋值符
在写代码的时候,我们可能经常对一个数进行自增,自减的操作,代码如下:
这样代码C语言提供了更加简便的写法:
C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
6.单目操作符:++ , --,+,-
前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称 为单⽬操作符。 ++、--、+(正)、-(负) 就是单⽬操作符的。
++和--
++是⼀种⾃增的操作符,⼜分为前置++和后置++,--是⼀种⾃减的操作符,也分为前置--和后置--.
前置++
计算口诀:先+1,后使用;
a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以计算技术后,a和b都 是11,相当于这样的代码:
后置++
计算⼝诀:先使⽤,后+1;
a原来是10,先使⽤,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以直接结束后a是 11,b是10,相当于这样的代码:
如果你看懂了前面两个++,那--就是同理的,只是把加一,换成了减一;
+和-
这⾥的+是正号,-是负号,都是单⽬操作符。运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负 数。
7.强制类型转换
在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
代码:
俗话说,强扭的瓜不甜,我们使用强制类型转换都是万不得已的时候使用,如果不需要强制类型转换就能实现代码,这自然更好。
8.scanf和printf介绍
printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以 定制输出⽂本的格式。
上⾯命令会在屏幕上输出⼀⾏⽂字“Hello World”。
printf() 不会在⾏尾⾃动添加换⾏符,运⾏结束后,光标就停留在输出结束的地⽅,不会⾃动换 ⾏。
为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。
printf()是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。
占位符
printf() 可以在输出⽂本中指定占位符。
所谓“占位符”,就是这个位置可以⽤其他值代⼊。
上⾯⽰例中, There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要 ⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这 ⾥代⼊的值必须是⼀个整数。
printf() 的第⼆个参数就是替换占位符的值,上⾯的例⼦是整数 3 替换 %d 。执⾏后的输出结果 就是 There are 3 apples 。
常用的占位符除了%d,还有%s表示代入的是字符串。
上⾯⽰例中, %s 表⽰代⼊的是⼀个字符串,所以 printf() 的第⼆个参数就必须是字符串,这个例 ⼦是 zhangsan 。执⾏后的输出就是 zhangsan will come tonight 。
输出文本里面可以有多个占位符。
printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。
占位符列举
printf() 的占位符有许多种类,与C语⾔的数据类型相对应。下面我列出常见的占位符
printf() 允许限定占位符的最⼩宽度。
上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。 输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空 格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
对于小数,这个限定符会限制所有数字的最小显示宽度
上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位, 所以 123.45 输出结果的头部会添加2个空格。
限定小数位数、
输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写 成 %.2f 。
上⾯⽰例中,如果希望⼩数点后⾯输出3位( 0.500 ),占位符就要写成 %.3f 。
这种写法可以与限定宽度占位符,结合使⽤。
上⾯⽰例中, %6.2f 表⽰输出字符串最⼩宽度为6,⼩数位数为2。所以,输出字符串的头部有两个 空格。
最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。
输出部分字符串
%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出 的⻓度,其中 [m] 代表⼀个数字,表⽰所要输出的⻓度。
上⾯⽰例中,占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符,即“hello”。
scanf
scanf()函数用于读取用户的键盘输入。
程序运行到这个语句的时候,会停下来,等待用户从键盘输入。
用户输入数据后,按下回车键后,scanf()就会处理用户的输入,将其存入变量
它的原型定义在头文件stdio.h
scanf() 的第⼀个参数 %d ,表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位 符, % 是占位符的标志, d 表⽰整数。第⼆个参数 &a表⽰,将⽤⼾从键盘输⼊的整数存⼊变量 a。
注意:
变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址, 即将变量 a的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。&——取地址操作符。
用户还可以通过scanf()输入多个值;例如:
scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
scanf的返回值
scanf()的返回值是一个整数,表示成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或 者遇到读取到⽂件结尾,则返回常量EOF。
占位符
scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
%c :字符。
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%Lf : long double 类型浮点数。
%s :字符串
%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。
上⾯所有占位符之中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符,总是返 回当前第⼀个字符,⽆论该字符是否为空格。
占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩ 字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。
scanf() 遇到 %s 占位 符,会在字符串变量末尾存储⼀个空字符 \0 。
scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以,储存字符串时, 很可能会超过数组的边界,导致预想不到的结果。为了防⽌这种情况,使⽤ %s 占位符时,应该指定 读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后 ⾯的字符将被丢弃。
上⾯⽰例中, name 是⼀个⻓度为11的字符数组, scanf() 的占位符 %10s 表⽰最多读取⽤⼾输⼊ 的10个字符,后⾯的字符将被丢弃,这样就不会有数组溢出的⻛险了。
感谢大家的浏览如果觉得博主写的还凑合希望你不要敛啬你得关注