C语言基础(下)
一.变量
1.什么是变量:c语言经常把变化的值叫做变量,不变的值叫做常量
2.变量创作的语法是这样的:数据类型(int,float,char…)+变量名(自己定义即可)
注意:变量名 1. 要尽量有意义 2. 只能由字母,数字,下划线组成(数字不能开头)3. 变量名不能是关键字
3.变量在创造时给一个值,这叫做初始化,例如:
int age=18
此时的18叫做初始值,age叫做变量
4.变量的分类:
- 全局变量:定义在大括号之外
- 局部变量:定义在大括号之内
尽量不要让全局变量与局部变量的变量名一样,如果一样则局部变量有先
就好比全局变量是共享单车,局部变量是家里的自行车,大括号就好比家,在家时肯定优先使用家里的自行车,而不是共享单车
5.例子:
int main()
{
int num1=0;
int num2=0;
sum=num1+num2;
scanf("%d%d",&num1,&num2);//sacnf:表示输入数据,&:表示取地址符号
int sum=0;
printf("sum=%d\n",sum);
return 0;
}
注意:c语言定义:变量要定义在代码最前面
二. 算术操作符
1.算术操作符:+,-,*,/,% (这五个字符也叫双目操作符)
2.除法运算:
- 除号两边如果都是整数,则执行的是整数的除法,即得到的只有商,余数会被省略掉
- 如果要计算出有小数的效果,则除号两端至少有一端是浮点数(小数)
注意:%f 和%lf 打印的时候默认打印6位小数
例1:除号两边都是整数
printf("%lf",3/2);
输出结果则为1.000000
例2:除号两边至少有一边有小数
printf("%lf",3.0/2);
输出结果则为1.500000
**例3:**把默认的6位小数改成1位小数:
printf("%.1lf",3.0/2);
输出结果则为1.5
3.取模(%)
%:求余数,即返回两个整数相除的余值
注意:这个运算符的两边只能是整数,不能是小数
负数求模规则:结果的正负由第一个运算符的正负号决定
例子:
printf("%d",11%-5);
输出结果是1,因为11是第一个运算符且为正数
三. 赋值操作符(=)
1.定义:在变量创建的时候给一个初始值叫做初始化,在变量创建好后,再给一个值,这叫赋值,
赋值操作符是一个随时可以给变量赋值的一个操作符
int a=0;//初始化
a=18; //赋值,这里使用的就是赋值操作符
2.连续赋值
int a=1;
Int b=2;
intc=3;
c=b=a+3;//从右向左赋值
3.复合赋值符
int main()
{
int a=10;
a+=4;//此处的全写为:a=a+4,因此+=就是常见的复合赋值符
printf("%d",a);
return 0;
}
四. 单目操作符
1.++
本质为+1,分为前置++和后置++
前置++的计算口诀为:先+1,后使用
int main()
{
int a=5;
int b=++5;
printf("a=%d b=%d\n",a,b);
return 0;
}
输出结果为a=6 b=6
分析:因为前置++的运算法则是先+1,再使用。所以a=a+1 b=a
后置++的计算口诀为:先使用,后+1
int main()
{
int a=5;
int b=a++;
printf("a=%d b=%d\n",a,b);
return 0;
}
输出结果为a=6 b=5
分析:因为后置++的运算法则是先使用,后+1(先使用是指可以假装把++去掉,只保留b=a)。所以a=6 b=5,
2.–
本质是-1,分为前置–和后置–
前置–的计算口诀为:先-1,后使用
后置–的计算口诀为:先使用,后-1
计算方法同++
3.+和-
这里的+和-与双目操作符的加和减不同,这里的+和—指的是数字的正和负
int a=10;
printf("%d\n",+a);//结果为10(因为10本身就是正数,会省略前面的+号)
printf("%d\n",-a);//结果为-10
五.强制类型转换
语法形式:(类型)
例子:
int main()
{
int a=(int) 3.14;
printf("%d\n",a);
return 0;
}
此时的输出结果为3
因为int是代表着整型,而3.14是一个小数,因此如果要想代码运作,则要在3.14前加上(int),这样才能使3.14强制转换为整型
六. printf和scanf介绍
(一). printf
1.定义
printf=print+f
print:打印 f:format:格式
因此连起来就是按照定义的格式打印数据
注意:在写printf时,一定要有头文件:#include<stdio.h>
2.占位符:
printf可以在输出文本中指定占位符
所谓占位符,就是这个位置可以用其他值带入
下面比较两个代码:
printf("there are 2 apples");
printf("there are %d apples", 2);
虽然它们输出的结果相同但明显的能看出来第二行的代码更灵活,因为它是可改的,逗号后面输入的整数数字都会在输出时体现出来
这里的%d就是占位符,表示这个位置要用其它的值替代,并且代入的值一定是整数
输出文本里可以使用多个占位符
int main()
{
printf("%s says it is %d o'clock\n", "xiao ming",10);
return 0;
}
上⾯⽰例中,输出⽂本 %s says it is %d o’clock 有两个占位符,第⼀个是字符串占位符 %s ,第⼆个是整数占位符 %d ,分别对应 printf() 的第⼆个参数( xiao ming )和第三个参数( 10 )。执⾏后的输出就是 xiao ming says it is 10 o’clock 。
总结:printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n +1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。
占位符列举
printf() 的占位符有许多种类,与C语⾔的数据类型相对应,下⾯按照字⺟顺序,列出常⽤的占位
符,⽅便查找,加粗的为常见的占位符
%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 类型。
%% :输出⼀个百分号。
3.输出格式
(1)限定宽度:
int main()
{
paintf("%5d\n",123);
return 0;
}
输出结果为 123(注意123前面有2个空格)
%5d表示占位符的宽度至少是5位,如果不满5位,则会在数字的前面补上相应空格,直至空格数+数字个数=最小限定宽度
int main()
{
printf("%12f\n",21.19);
return 0;
}
输出结果为 21.190000(注意21.190000前面还有3个空格)
这个举的是小数的例子,小数的默认显示精度是小数点后6位
int main()
{
printf("%-5d\n",123);
return 0;
}
输出结果为123 (注意此时的2个空格在123后面)
这个举的是把输出内容改成左对齐的例子
(2)限定小数位数
输出小数时,有时希望限定小数的位数。举例来说,希望小数点后面保留两位,占位符可以写成**%.2f**
int mian()
{
printf("%.2f\n",0.5);
return 0;
}
输出结果为0.50
这种写法可以与限定占位符结合使用
int main()
{
printf("%7.2",21.5);
return 0;
}
这样的话输出结果就为 21.50(注意21.50前面有两个空格)
最小宽度和小数位数这两个限定值,都可以用*****代替,通过printf( )的参数传入
int main()
{
printf("%*.*f\n",7,2,21.5);
return 0;
}
(3)输出部分字符串
%s占位符用来输出字符串,默认的是全部输出。如果只想输出一部分可以用 %.数字s 的形式写,.数字表示要输出的长度
int main()
{
printf("%.5s\n",hello world);
return 0;
}
输出结果为hello
(二). scanf
1.基本用法
当我们有了变量,我们需要给变量输入值就可以使用scanf函数,如果想要将变量的值输出在屏幕上的时候可以使用printf函数。
scanf函数用于读取用户的键盘输入
当程序运行到这个语句时会自动停下,等待用户输入信息。
用户输完信息按回车后,scanf就会处理用户的输入,将其存入变量。
形式:
scanf("%d", &abc); //&的意思是取地址
所以这句话的意思就是:把一个整数放在abc这个地址内
例子:
int main()
{
int score=0;
printf("请输入你的成绩:");
scanf("%d\n",&score);
printf("成绩是:%d\n",score);
return 0;
}
这个例子可以更深的感受到scanf的作用,首先计算机会打印出"请输入你的成绩:",这是就是scanf的作用(它可以让计算机停止在这一刻,等待用户的输入,等用户输入完按下回车,程序会运行大最后一行,打印出“成绩是:xxx”
当然用户可以一次性的在键盘上输入多个变量。例子:
int main()
{
int a=0;
int b=0;
float c=0.0f;
float d=0.0f;
scanf("%d%d%f%f",a,b,c,d);
printf("a=%d\n",a);
printf("b=%d\n",b);
printf("c=%d\n",c);
printf("d=%d\n",d);
return 0;
}
解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止。例子:
int main()
{
int a=0;
float b=0.0f;
sacnf("%d\n",a);
printf("%d\n",a);
scanf("%f\n",b);
printf("%f\n",b);
return 0;
}
这是输入-88.45e12¥5763 注意:0.45e12的意思是0.45乘10的12次方
结果为-88 449999994880.000000
解析:在计算机第一次解读时,解读到小数点前为第一次,因此打印结果为-88,由上面的介绍得知,第二次解读会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到第一个不符合条件的字符为止,因此第二次读取的就是0.45乘10的12次方,后面对¥5763都是多余的
这时候想必大家都有一个疑问,为什么0.45乘10的12次方会生成449999994880.000000,这是因为小数在计算机中可能无法精确保存
2.scanf的返回值
规则:scanf( )的返回值是一个整数,表示成功读取的变量个数。如果没有读取任何项,或者匹配失败,则返回0。如果在成功读取任何数据之前,发生了读取错误或者是读到文件结尾,则返回常量EOF(end of file)-1。
例子:
int main()
{
int a=0;
int b=0;
float c=0.0f;
int d= scanf("%d %d %f",a,b,c);
printf("a=%d b=%d c=%f\n",a,b,c);
return 0;
}
下面的图片显示着不同的输入和输出结果,它们可以更好的验证scanf返回值的规则
补充一下,^z其实是快捷键ctrl+z打印出来的,表示不输入任何值,自动跳过,在vs2022中一般要写上三个ctrl+z电脑才能识别
3.占位符
scanf() 常⽤的占位符如下,与 printf() 的占位符基本⼀致。
%c :字符
%d :整数。
%f : float 类型浮点数。
%lf : double 类型浮点数。
%Lf : long double 类型浮点数。
%s :字符串。
%[ ] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。
上面的占位符之中,除了%c以外,都会自动忽略起手的空白字符。%c不忽略起手的空白字符
如果想要强制跳过字符前的空白字符,可以写成scanf(" %c",&abc),其实就是在%c之前加一个空格
下面要特别注意一下%s,他的规则于%c正好相反,它是可以忽略起手的空白字符,但是当它遇到字符串中的的空格时,它将停止。例子:
printf main()
{
char arr[10]={0};
scanf("%s", arr);
printf("%s\n", arr);
return 0;
}