落花时节又逢君(再见c语言)(第二章)

1. 数据类型介绍

2. signed 和unsigned

3. 数据类型的取值范围

4. 变量

5. 算术操作符:+、-、*、/、%

6. 赋值操作符:=和复合赋值

7. 单⽬操作符:++、–、+、

8. 强制类型转换

9. scanf和printf介绍

一. 数据类型介绍

在我们日常的生活中接触着各种类型的数据 :小数 整数 等~其他各种类型的数据
但是总的来说我们都可以把其归纳为以下几类
在这里插入图片描述
1.1

字符类型
char
(signed)char 有符号字符类型
unsigned char 无符号字符类型

1.2

整形
int
(signed) int
unsigned int
短整型
short int
(signed) short int
unsigned short int
长整型
long int
(signed) long int
unsigned long int
> 更长整形
long long int

1.3

浮点类型
flaot 单精度浮点数
double 双精度浮点数
long double

1.4

Bool 类型
注:这是在C99之后引入的一种新类型
C语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数
在C99中也引⼊了布尔类型,是专⻔表⽰真假的。_Bool0 表⽰假,⾮零值表⽰真。

布尔类型的使用要包含的头文件是<stdbool.h>
布尔类型表示真假的是 true false

接下来举一个例子

#include<stdio.h>
#include<stdbool.h>
int main()
{
	bool num1 = false;
	if (num1 == true)
	{
		printf("ikun二年半");
	}
	else
		printf("小黑子");
	return 0;
}

1.5

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

而sizeof 操作符就是来计算各种类型数据的大小。 单位是字节
sizeof的操作对象既可以是数据类型 又可以是变量或表达式

sizeof (int /double )
sizeof(5 /bianliang1)
这里需要注意的是sizeof的返回值是一个不确定的类型,为此
C语⾔提供了⼀个解决⽅法,创造了⼀个类型别名
回值类型。对应当前系统的size_t ,⽤来统⼀表⽰sizeof 的返sizeof 的返回值类型,可能是unsigned int ,也可能是unsigned long long

这里需要注意以下几点

1.sizeof
的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
2.sizeof
后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
3.sizeof 的计算结果是size_t 类型的(占位符是%zd)

接下来我们来举几个例子

在这里插入图片描述

我们会发现虽然打印出了每个数据类型的字符场长度,但是下边会有警告

在这里插入图片描述

但是如果占位符换成**%zd**,则就没有影响。这就说明了上边我们所提出的问题

1.6

这里我们还需要注意的是sizeof在参与表达式时 ,sizoef后的表达式是不计算的
例如
如果这里计算的话,sum的值应为15;但是结果为0。则说明我们的以上说法是正确的
在这里插入图片描述

二、 signed 和 unsigned

从其汉文中我们可以看出一个是无符号的一个是有符号的
那么两者的区别是什么呢?接下来同志们我们来一起研究

signed int 就相当于 int

unsigned int 就是其本身

整数变量声明为unsigned (只有正值)
的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。
⽐如,16位的signed short int 的取值范围是:-32768~32767,最⼤是32767;⽽unsigned short int 的取值范围是:0~65535,最⼤值增⼤到了65,535。

对于字符类型和整形是有区别的
signed char
unsigned char

注意,C语⾔规定
char 类型默认是否带有正负号,由当前系统决定。
这就是说,char 不等同于unsigned char 。它可能是 signed char 也可能****是unsigned char ,这一点与int 类型不同int中signed int就等于interesting

、数据类型的取值范围

上述的数据类型很多,尤其数整型类型就有short、int、long、longlong四种,为什么呢?
其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值:
limits.h ⽂件中说明了整型类型的取值范围。
float.h 这个头⽂件中说明浮点型类型的取值范围。

这里我给大家一些参考

(1)整型:

  • char (通常 1 个字节,8 位):-128 到 127 或 0 到 255。
  • short int (通常 2 个字节,16 位):-32768 到 32767。
  • int (通常 4 个字节,32 位):-2147483648 到 2147483647。
  • long int (通常 4 个字节或更多,具体取决于编译器)。
    (2)
    浮点型:
  • float :大约 ±3.4028235E38F。
  • double :大约 ±1.79769313486231570E+308。

、变量

从字面来理解就是可改变的量 那么我们以专业的角度来理解呢?

欲知后事如何,且听下级分解

在上边我们介绍了类型,那么作用是什么呢?(猜猜呢 )
当然是与我们本节介绍的变量是有关的

了解清楚了类型,我们使⽤类型做什么呢?类型是⽤来创建变量的。
什么是变量呢?C语⾔中把经常变化的值称为变量,不变的值称为常量。
变量创建的语法形式是这样的:
type_name = 初始值

接下来 我们来举几个例子

#include<stdio.h>
int main()
{
	int num = 0;
	char ch = 'a';
	float fl = 1.0;  // 不难看出 变量的命名的格式就是我们上边所描述的
	double  a = 3.0; // 同志们可以看见我在创建变量时都会给其一个数值
	return 0;        //在创建变量时都会给其一个数值:这就叫做初始化
}

4.2 变量的分类

变量的分类是有两种的:
1 全局变量
2 局部变量
注意:(当全局变量和局部变量同时出现的时候 局部变量时优先的
多说无益:实践才是检验真理的唯一标准

int num = 100;  //全局变量   第一种情况
int main()
{
	float fl = 5.0;              
	printf("%d\n", num);                   
	printf("%f\n", fl);
	return 0;
}


//int num = 100;//全局变量 第二种情况
int main2()
{
	float fl = 5.0;
	printf("%d\n", num);
	printf("%f\n", fl);
	return 0;
}

//int num = 100;//全局变量   第三种情况
int main1()
{
	int num = 10;//局部变量
	float fl = 5.0;
	printf("%d\n", num);
	printf("%f\n", fl);
	return 0;
}



在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从这三种情况下我们就可以很好的感知全局变量和局部变量的关系。

4.3 全部变量和局部变量的储存位置

⼀般我们在学习C/C++语⾔的时候,我们会关注
内存中的三个区域:栈区、堆区、静态区。

  1. 局部变量是放在内存的栈区
  2. 全局变量是放在内存的静态区
  3. 堆区是⽤来动态内存管理的(后期会介绍)
    在这里插入图片描述

、算术操作符
我们从刚开始来接触数学这些算术操作符就伴随着我们。
那么在c语言中这些操作符是怎么使用的呢?
在写代码时候,⼀定会涉及到计算。C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作叫算术操作符。分别是+、-、*、/、%、,这些操作符都是双⽬操作符。
(双目操作符简单来说就是对两个数字进行操作)
注:操作符也被叫做:运算符,是不同的翻译,意思是⼀样的。

接下来我们对其操作符逐一举例操作

1 ‘+++++’

在这里插入图片描述

2 ‘-----------’

在这里插入图片描述

3 ‘*****’

在这里插入图片描述

4’ ///’ (这里举两个例子)
这里要注意除法一般是有小数的对应的占位符要记得换

在这里插入图片描述

上⾯⽰例中,尽管变量x 的类型是float (浮点数),但是6 / 4
得到的结果是1.0 ,⽽不是1.5 。原因就在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。

在这里插入图片描述

5‘%%%%%%’
这个是取模运算

在这里插入图片描述

以上就是5种运算操作符的举例,都是对两个数字进行操作,因此就被称为双目操作符 (同志们有没有很好的体会到了呢?)

六、赋值操作符和复合赋值
‘=’ 被称为赋值操作符

6.1
c语言支持连续赋值
但是我们一般不用连续赋值,因为不好理解,代码可读性差
在这里插入图片描述
同志们比较上述两种格式是不是第二种更加容易理解呢。

6.2
为了使代码更简洁以及节省空间我c语言又引入了复合赋值操作符

1 -=
2 + =
3 / =
4 *=
5 %=
目前我们先介绍这5种复合赋值操作符
那么接下来我们还是一一举例来说明

在这里插入图片描述


int main()
{
	int a = 0;
	a = a + 5;
	printf("a=%d\n", a);
	a = 0;  **//这里给a=0的目的是与初始的值保持一致,因为前边的运算已经改变了a的数值**
	a += 5;  // 所以我们要重新给其fuzhi  下边的操作一样如此
	printf("a=%d\n", a);
	printf("\n");
	long int b = 15;
	b = b - 5;
	printf("b=%d\n", b);
	b = 15;
	b -= 5;
	printf("b=%d\n", b);
	printf("\n");

	float c = 75.0;
		c = c * 2.0;
		printf("c=%f\n", c);
		c = 75.0;
		c *= 2.0;
		printf("c=%f\n", c);
		printf("\n");

		double d = 60.0;
		d = d / 7.0;
		printf("d=%lf\n", d);
		d = 60.0;
		d /= 7.0;
		printf("d=%lf\n", d);
		printf("\n");

		int e = 70;
		e = e % 6;
		printf("e=%d\n", e);
		e = 70;
		e %= 6;
		printf("e=%d\n", e);
		printf("\n");

	return 0;
}

这里我们就会发现两种计算方法不同但是结果却是一样的
那么同志们你喜欢哪种方式呢?

七、 单目操作符

学完了双目操作符那么我们来介绍一下单目操作符
前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。++、-、+(正、-(负) 就是单⽬操作符的。
字面意思就是对一个数字进行操作的字符,那么它有什么功效呢
接下来让我们携手来共同探索一下。

对于‘++’来说分为两种
7.1

第一种 :前置++
例如:a++;
第二种 后置++
例如:++a;
那么两种有什么不同呢? 同志们让我们一起来用代码来回答

在这里插入图片描述

int main()
{
	int a = 5 ;
	int b = 0;
	b = a++;    //对于这个我们可以发现a的值是先赋给了b然后再进行++的
	printf("a=%d,b=%d", a, b);//运算
	printf("\n");
	
	int c = 5;
	int d = 0;  //而这个则是c的值先进行++的运算,运算完后的结果
	d = ++c;  //再赋给d
	printf("c=%d,d=%d",c, d );

	return 0;  //这就是两者的区别
}

那么我们就可以总结一个口诀

1、对于前置++ :a++
就是:先使用 ,再++
2、对于后置++:++a
就是先++ ,再使用

7.2
‘–的’使用方法与++一样同志们可以自行进行尝试一下

(纸上得来终觉浅,绝知此事要躬行)

、强制类型转换

语法形式非常简单
如下:

(类型)

这种情况是我们不到万不得已的情况是不使用的,我们用代码来解释一下原因

在这里插入图片描述

int main()

{
	int a = 5.89;
	printf("%d", a);  //这种情况下代码会报警告
	return 0;
}

在这里插入图片描述

int main()

{
	int a = (int)5.89;  //这种情况下没有了警告但是数据也是只保留了整数,同样丢失了
	printf("%d", a);   //数据 因此我们一般是不用这种方法的
	return 0;
}

(强扭的瓜不甜)

九、scanf 和printf

scanf : 就是输入 标准输入指的就是键盘
printf: 就时输出 标准输出指的就时屏幕

接下来我们来介绍printf函数的作用
在这里插入图片描述
我们可以看出用printf函数会把我们想要打印的东西在屏幕上打印出来。
但是不会再屏幕上自动换行 光标会停留在本行的末尾加入‘\n’光标才可以停留在下一行
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>   //这个就是头函数
int main()
{
	printf("Hello world\n"); //加入\n就可以换行让代码更加具有可读性

	printf("ikun\n");   //printf是库函数在使用的时候需要包含头函数
	printf("ni gan ma\n");
	return 0;
}

9.1
占位符
解释:所谓“占位符”,就是这个位置可以⽤其他值代⼊。

在我们上边的打印的时候 为什么不同类型的数据对应得占位符是不同的 ,这是因为c语言规定了每种数据类型都要有特定的占位符

话不多说我们用代码来实操

int main()

{
	printf("我们是%d年的小黑子\n", 5);
	printf("我已经练习%.1f年了\n", 2.5);
	printf("现在是%d月%d日 %.2lf分\n", 8, 10, 9.55);
	printf("%c 是一个%s 学生\n", 'a', "good");
	short int a = 10;
	printf("%hd\n", a);

	printf("%p\n", &a);

	long int b = 50;     //这里我们就能清晰的感知不同类型的数据对应得占位符是不一样的
	printf("%ld\n", b);

	unsigned short int c = 20;
	printf("%hu\n", c);

	unsigned  long int d = 50;
	printf("%lu\n", d);

	printf("%x\n", 55);

	printf("%zd\n", sizeof(5));
	return 0;
}

在这里插入图片描述

这里的我们主要介绍常用的占位符,同志们有兴趣可以自己研究一下其他的占位符

9.2

printf 可以限制输出的格式和最小的宽度

在这里插入图片描述
对于此代码我们如果没有限制的话,它会自动保留6位小数
那如果我们想要其保留2 位或者3位小数呢?
或者想要其输出格式变多或变少呢?

1.只需要在%f中间加上’.数字‘即可
例如:%.2f(输出格式)
2. .只需要在%f中间加上’数字‘即可
例如:%2f(输出宽度)

代码举例:
在这里插入图片描述

9.3

对于字符串

%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤%.[m]s 指定输出的长度,其中[m] 代表⼀个数字,表⽰所要输出的⻓度。

代码表示:

int main()
{
	printf("%.5s", "ikun good");
	return 0;
}

在这里插入图片描述

9.4 scanf 函数

对于scanf函数来说,它本事也是一个库函数,在使用的时候需要包含一个头文件#include<stdio.h>.
scanf 的作用
>当我们有了变量,我们需要给变量输⼊值就可以使⽤scanf
函数,如果需要将变量的值输出在屏幕上就需要printf函数

(两者往往是结合一起来使用的)

int main()
{
	int score = 0;
	printf("请输入该队员的得分情况\n");
	scanf("%d", &score);
	printf("该队员的得分情况=%d分\n", score);
	return 0;
}

在这里插入图片描述
该代码为什么会报这个警告呢?不要着急这个代码的警告不会影响代码
的运算,所以我们一般会忽略

9.5 scanf的基本用法与printf很相似

scanf()
函数⽤于读取⽤⼾的键盘输⼊。
程序运⾏到这个语句时,会停下来,等待⽤⼾从键盘输⼊。
⽤⼾输⼊数据、按下回⻋键后,
scanf()
就会处理⽤⼾的输⼊,将其存⼊变量。
它的原型定义在头⽂件
stdio.h

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

scanf(“%d”, &i);
它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与译器如何解读⽤⼾的输⼊,需要提取的数据是什么类型。这是因为C语⾔的数据都是有类型的,printf() 的占位符基本⼀致),告诉编
scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数
据。
它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。
上⾯⽰例中,
scanf() 的第⼀个参数%d ,表⽰⽤⼾输⼊的应该是⼀个整数。%d就是⼀个占位符,%是占位符的标志,d表⽰整数。第⼆个参数&i表⽰,将⽤⼾从键盘输⼊的整数存⼊变量i 。
& 运算符(指针变量除外),因为注意:变量前⾯必须加上
即将变量i的地址指向⽤⼾输⼊的值。如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加&运算符。

接下里举一个scanf输入多个占位符的例子

在这里插入图片描述

在这里插入图片描述
通过这两个图片我们对比得知虽然两者输入的格式不一样但是为什么结果是一样的呢。

scanf()
原因如下:
scanf函数处占位符的时候,会自动忽略空⽩字符,包括空格、制表符、换⾏符等。
所以,⽤⼾输⼊的数据之间,有⼀个或多个空格不影响
scanf() 解读数据。另外,⽤⼾使⽤回⻋键,将输⼊分成⼏⾏,也不影响解读。

9.6

scanf()
处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,照占位符对缓存进⾏解读。
解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。

空口无凭,我们直接上代码
在这里插入图片描述
这里%d读取了13
%f读取了0.45
遇见-不符合条件则就结束了

9.7
scanf的返回值,同志们还记得不我上边的一个图片上报警警告说我们忽略了scanf的返回值 。那么scanf的返回值是什么?

scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回0。
如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件尾,则返回常量EOF(-1)。EOF-endoffile ⽂件结束标志
这里按(ctrl + z)可以提前结束一个数据的读取

1 我们先来写一个全部读取成功的代码
我们这里r= 3;就表示的是三个类型的数据类型全部读取成功
在这里插入图片描述
2 我们再写一个部分读取成功的代码
来观察r的值
这里我们按了两次ctrl+z提前结束了读取
r的值就为1
在这里插入图片描述

3
如果我们全部按ctrl+z呢?
这里r=-1;对应了我们上边的结论
在这里插入图片描述

4如果读取失败那么r的值是社么呢?
毫无疑问 r = 0 ;
在这里插入图片描述

9.8
关于scanf的占位符

scanf的占位符和printf的占位符基本上是一样的
上⾯所有占位符之中,除了
%c
以外,都会⾃动忽略起⾸的空⽩字符。
回当前第⼀个字符,⽆论该字符是否为空格。
如果要强制跳过字符前的空⽩字符,可以写成%c 不忽略空⽩字符,
(这里我感觉是因为空格就是一个字符)
如果要强制跳过字符前的空⽩字符,可以写成scanf(" %c", &ch) ,即%c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。

举例子
1 输入的数据没有空格
在这里插入图片描述
2 输入的数据有空格
在这里插入图片描述
3 再scanf前加上空格
即使再输入时候有空格 再打印的时候空格也会忽略掉
在这里插入图片描述
9.9
赋值忽略符*

有时候用户无法避免的会输入一些不符合预定的格式。
那么此时就要用一些方法来使其忽略特定的格式
*该符号就起到至关重要的作用

1.看如果我们不按照scanf 后边()内的格式输入
则会与其输入的内容不一致
在这里插入图片描述

2.只有按照按照scanf 后边()内的格式输入
才不会报错
在这里插入图片描述

3 现在我们来解决这种问题
只需要再中间加上%*c 即赋值忽略符就不用考虑这种问题了
在这里插入图片描述

好 那么我们这一张也到此结束了 感谢大家的阅读

(路漫漫其修远兮,吾将上下而求索)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值