C语言——数据类型和变量(第二讲)(下)

前言

更新了!更新了!这么多天懒的,终于把C语言第二讲更完了,喜欢就点个赞吧!

一 赋值操作符:=和复合赋值

1.连续赋值

1.初始化:在变量创建的时候给一个初始值叫初始化。
2.赋值:在变量创建好之后再给一个值,叫赋值。
3.连续赋值:从右向左依次赋值

//初始化,赋值
#include<stdio.h>

int main()
{
	int a = 0;//初始化:在变量创建的时候给一个初始值叫初始化。
	int b = 0;
	a = 3;//赋值:在变量创建好之后再给一个值,叫赋值。

	/*连续赋值*/
	b = a = a + 3;//从右向左依次赋值
	return 0;

2.复合赋值符

1.在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:

int a = 10;
a = a+3;
a = a-2;
//C语⾔给提供了更加⽅便的写法:
int a = 10;
a += 3;
a -= 2;
//也就是说,a = a+3相当于a += 3,以此类推。

C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:

+=
-=
*=
/=
%=
//下⾯的操作符后期讲解 >>=
<<=
&=
|=
^=

二 单目操作符

1.双目操作符:2个操作数,例如:3+4 5/2。
单目操作符:1个操作数。
2.++和–
++是⼀种⾃增的操作符,⼜分为前置++和后置++,–是⼀种⾃减的操作符,也分为前置–和后置–.

1.前置++,后置++,前置–,后置

前置++:先+1,后使用

#include<stdio.h>

int main()
{
	int a = 3;
	int b = ++a;//前置++
 //先+1,后使用
	//a=a+1,b=a;
	printf("a=%d b=%d\n", a, b);

	return 0;
}

后置++:先使用,后+1

//后置++
 //先使用,后+1
#include<stdio.h>

int main()
{
	int a = 2;
	int b = a++;
	printf("a=%d,b=%d\n", a, b);

	return 0;
}

前置–:先-1,后使用

#include<stdio.h>

int main()
{
	int a = 1;
	int b = --a;
	printf("a=%d,b=%d\n", a, b);

	return 0;
}

后置–:先使用,后-1

//后置--
//先使用,后-1
#include<stdio.h>

int main()
{
	int a = 2;
	int b = a--;
	printf("a=%d,b=%d\n", a, b);

	return 0;
}

2.+和-

1.这⾥的+是正号,-是负号,都是单⽬操作符
2.运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负
数。

三 强制转换类型

请看代码:

int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告

为了消除这个警告,我们可以使⽤强制类型转换

int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分

注意:强制类型转换都是万不得已的时候使用。

四 Scanf和Printf介绍

Printf介绍

1.基本用法

1.printf() 的作⽤是将参数⽂本输出到屏幕。f 代表 format (格式化),表⽰可以
定制输出⽂本的格式
2.printf()不会⾃动换⾏,为了让光标移到下⼀⾏的开头,可以在输出⽂本的结尾,添加⼀个换⾏符 \n 。
3.**printf() 是在标准库的头⽂件 stdio.h 定义的。**使⽤这个函数之前,必须在源码⽂件头部引⼊这个头⽂件。
注意:若编译器报错为“无法解析的外部符号printf",说明未编写头文件。

2.占位符

1.printf() 可以在输出⽂本中指定占位符。

//占位符(这个位置可以被其它值代入)
#include<stdio.h>

int main()
{
	printf("there are %d apples\n", 3);
	printf("%s will come tonight\n", "zhangsan");
	return 0;
}
//执⾏后的输出结果就是 There are 3 apples 。

2.占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这
⾥代⼊的值必须是⼀个整数。printf() 的第⼆个参数就是替换占位符的值。

3.占位符列举

**常见的占位符

• %c :字符。
• %d :⼗进制整数。
• %hd :⼗进制 short int 类型。
• %u :⽆符号整数(unsigned int)。
• %f :⼩数(包含 float 类型和 double 类型)。
• %Lf :long double 类型浮点数。
• %lf :double 类型浮点数。
• %s:字符串类型
• %p :指针(地址)**

占位符全

• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号。

4.输出格式

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

1.限定宽度

1.printf() 可以定制占位符的最小宽度。

#include<stdio.h>

int main()
{
	printf("%d\n", 123);
	printf("%5d\n", 123);
	return 0;
}
// 

%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。**输出的值默认是右对⻬。**如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。

对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。

// 输出 " 123.450000"
#include <stdio.h>
int main()
{
 printf("%12f\n", 123.45);
 return 0;
}

由于⼩数的默认显⽰精度是⼩数点后6位,%12f 表⽰输出的浮点数最少要占据12位,所以 123.45 输出结果的头部会添加2个空格。

2.限定小数位数

举例来说,希望⼩数点后⾯只保留两位,占位符可以写
成 %.2f 。

//限定小数位
#include<stdio.h>

int main()
{

	printf("Number is %.2f\n", 1.5);//举例子,如果希望小数点后面只保留两位,占位符可以写成%.2f。
	printf("Number is %f\n", 1.5);
	printf("Number is %6.2f\n", 1.5);//%6.2f表示输出字符串最小宽度为6,小数位数为2.
	printf("Number is %*.*f\n", 6, 2, 1.5);//%6.2f还可以通过传参的方式,最小宽度和小数位数这两个限定值,都可以用*代替,通过printf()的参数传入
	return 0;
}
3.输出部分字符串

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


#include<stdio.h>

int main()
{
	printf("%.5s\n", "hello world");
	return 0;
}

上⾯⽰例中,占位符 %.5s 表⽰只输出字符串“hello world”的前5个字符,即“hello”。

4.总是显示正负号

1.默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可以在占位符的 % 后⾯加⼀个 + 。

//总是显示正负号
#include<stdio.h>

int main()
{
	printf("%+d\n", 12);
	printf("%-d\n", -12);
	return 0;
}
//上面示例中,%d可以确保输出的数值,总是带有正负号


Scanf介绍

当我们有了变量,我们需要给变量输⼊值就可以使⽤ scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使⽤ prinf 函数。

#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>

int main()
{
	int age = 0;
	printf("请输入年龄:\n");
	scanf("%d\n", &age);//&-取地址操作符,age是变量,需要取地址
	printf("%d\n", age);
	return 0;
}

注:标准输⼊⼀般指的就是键盘,标准输出⼀般指的就是屏幕

1.基本用法

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

  1.                `scanf("%d", &i);`
    

因为 C 语⾔的数据都是有类型的, scanf() 必须提前知道⽤⼾输⼊的数据类型,才能处理数据。
上⾯⽰例中, scanf() 的第⼀个参数 %d ,表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位符, % 是占位符的标志, d 表示整数第⼆个参数 &i 表⽰,将⽤⼾从键盘输⼊的整数存⼊变量i.
3.注意:变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。

4.scanf可以输入读入多个变量.

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	float f = 0;
	double d = 0;
	scanf("%d%d%f%lf", &a, &b, &f, &d);
	printf("%d %d %f %lf",a,b,f,d);
	return 0;
}
scanf() 处理数值占位符时,会⾃动过滤**空⽩字符,包括空格、制表符、换⾏符**

5.scanf读取原理

#include<stdio.h>

int main()
{
	int x;
	float y;
// ⽤⼾输⼊ " -13.45e12# 0"
	scanf("%d", &x);
	printf("%d\n", x);//注:e-科学计数法:表示前面的数字乘10的n次方
	scanf("%f", &y);
	printf("%f\n", y);
	return 0;
}

上⾯⽰例中, scanf() 读取⽤⼾输⼊时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读
取到 -13 停下来,因为后⾯的 . 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 。
第⼆次调⽤ scanf() 时,就会从上⼀次停⽌解读的地⽅,继续往下读取。这⼀次读取的⾸字符
是 . ,由于对应的占位符是 %f ,会读取到 .45e12 ,这是采⽤科学计数法的浮点数格式。后⾯的
#不属于浮点数的有效字符,所以会停在这⾥。
由于 scanf() 可以连续处理多个占位符,所以上⾯的例⼦也可以写成下⾯这样。

2.为什么scanf函数不安全?

1.scanf不会去检测目标空间能不能放得下,所以此函数相对不安全。
2.解决方法:解决Scanf函数不安全问题

3.Scanf的返回值

1.scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF。

#include<stdio.h>

int main()
{
	int a = 0;
	int b = 0;
	int c = 0;
	int r = scanf("%d%d%d", &a, &b, &c);
	printf("r=%d\n", r);
	return 0;
}

输⼊输出测试:
在这里插入图片描述

4.占位符

1.scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。

• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。

2.scanf特殊占位符-%c(%c不忽略空白字符,总是返回当前第一个字符)

#include<stdio.h>

int main()
{
	char ch = 0;
	scanf("%c", &ch);
	printf("%c-----", ch);
	return 0;
}

如果要强制跳过字符前的空⽩字符,可以写成 scanf(" %c", &ch) ,即 %c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。
3.下⾯要特别说⼀下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到**空⽩字符(即空格、换⾏符、制表符等)**为止。

5.赋值忽略符

有时,⽤⼾的输⼊可能不符合预定的格式。

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 printf("%d %d %d\n", year, month, day);
 return 0;
}

上⾯⽰例中,如果⽤⼾输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他格式,⽐如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符
只要把 ***** 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

#include <stdio.h>
int main()
{
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d%*c%d%*c%d", &year, &month, &day);
 return 0;
}

上⾯⽰例中, %*c 就是在占位符的百分号后⾯,加⼊了赋值忽略符 * ,表⽰这个占位符没有对应的变量,解读后不必返回。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值