1.数据类型介绍
1)两种类型:
(一)内置数据类型(本身自带,可以直接使用):
*字符型:‘a’
char--character
*整形:描述整数
int 整形
short 短整型
long 长整形
long long 更长的整形
*浮点型:描述小数
float单精度浮点型
double双精度浮点型
long double
*布尔类型:专门用来描述真和假的类型
-Bool bool
布尔类型的使用得包含头文件stdbool.h
布尔类型变量的取值只能是true或者false
(二)自定义类型:略
2)数据类型的长度
*size of 操作符 也是关键字,单位是字节
--求一个·数据类型的长度:printf("%zd\n",size of(char)) 1
--求一个整形的长度:如int a=10
可以写printf("%zd\n",sizeof a)或printf("%zd\n",sizeof(a))或printf("%zd\n",size of(int))
*补充---计算机中常见的单位:bit:存储一个二进制位所需要的空间就是一个bit位
Byte=一个字节=八个bit位
KB=1024Byte
MB=1024KB
GB=1024MB
TB、PB ......
2.signed和unsigned
c语言用这俩个关键字来修饰字符型和整形的
*signed关键字修饰的一个变量带有正负号
*unsigned关键字修饰的变量没有正负号,只能修饰零和正整数
*int默认有符号,它等价于signed int
*无符号的整形:unsigned int
*unsigned的好处:同样的内存能表示的最大整数值增大了一倍
*char不等于signed char,char有没有符号是由编译器决定的
*%d打印有符号的整数
%u打印无符号的整形
%lu打印无符号的长整型
%llu打印无符号的长长整形unsigned long long int
*size of的返回类型是size_t类型的
size_t n=sizeof(int)
printf("%zd\n",n)
3.数据类型的取值范围
limits.h
float.h
4.变量
1)变量的创建
数据类型是用来创建变量的
*C语言把经常变化的值称为变量,不变的值称为常量
*创建变量的语法形式:数据类型+变量名字
date_type name(变量名字自己编)
*补充:变量名字尽量起的有意义;变量名的组成只能是数字、字母、下划线且不能数字开头;变量名不能是关键字。
*变量在创建的时候给一个初始值就叫初始化
2)变量的分类:全局变量和局部变量
大括号外面的变量就是全局变量
大括号里面的变量就是局部变量
*当全局和局部变量名字冲突时,局部优先
*全局和局部变量在内存中存储在哪里呢?
我们创建变量的本质时在内存中申请了一块空间
内存中有三个区域;栈区、堆区、静态区
全局变量在静态区,局部变量在栈区,(堆区是用来动态内存管理的)
5.算术操作符+ - * / %
双目操作符:有两个操作数的操作符
1)/除号
除号的两端如果都是整数,执行的是整数除法,结果取整;
#include<stdio.h>
intmain()
{
floatx =6/4;
inty =6/4;
printf("%f\n", x); //输出1.000000
printf("%d\n", y); //输出1
return0;
}
如果要计算出小数的效果,那么除号的两端至少有一个数得是浮点数(用%lf打印)
#include<stdio.h>
intmain()
{
floatx =6.0/4; //或者写成6 / 4.0
printf("%f\n", x); //输出1.500000
return0;
}
%f和%lf默认结果是六位小数,如果想要一位小数,改为%.1lf
#include<stdio.h>
intmain()
{
intscore =5;
score = (score /20) *100;
return0;
}
这串代码的运行结果是0,因为5/20整除后的结果是0,乘上100也是0
想要得到预想的结果,只需要把除号右边的数改成浮点数,这样得出的结果就是25
intscore =5;
score = (score /20.0) *100;
return0;
2)%取余
*返回两个整数相除的余数。这个运算符只能应用于整数
*负数也可以取余,但是结果的正负号取决于左操作数的正负号
6.赋值操作符=
*初始化不是赋值
int a=10; 初始化
a=5; 赋值
*连续赋值 如c=b=a+3,从右往左赋(支持但是不推荐)
==复合赋值符==
int a=10
a=a+4
可以写成a+=4
7.单目操作符
只有一个操作数
1)++自增操作符,分为前置++和后置++,且都是加一
前置++(++a):先加一,后使用
int a =5;
int b =++a;
printf("a=%d b=%d\n",a,b);
这样的结果是6 6
后置++(a++):先使用,后加一
int a =5;
int b =a++;
printf("a=%d b=%d\n",a,b);
这里a先赋值给b后再加一,结果应该是5 6
--自减操作符:也分为后置--和前置--,和·++同理
int a=5
prntf("%d",a--)
这里的结果是5
2)正号和负号+-
运算符+对正负值没有影响,完全可以省略
运算符-用来改变一个值的正负号,负数前面加-得正数,正数前面加-得负数
8.强制类型转换
实在万不得已的时候使用
如int a =(int)3.14 ,打印a得到3
注释:·直接写出的字面浮点数,会被编译器直接识别为double类型,如果想改为float,可以直接在浮点数后面加上f (3.14f)
入过一个浮点数的数字比较小,用float,比较大用double
9.scanf和printf的介绍
9.1printf:按照制定的格式打印数据(f:format)
1)关于printf:
*报错误:无法解析嗯外部符号--忘记包含头文件了
*换行效果:在输出文本末尾加\n,让光标移到下一行的开头
*它是库函数,使用前必须在源码文件头部引入头文件stdio.h
2)占位符:
*printf可以在输出文本中指定占位符,即这个位置可以用其他值代入
*占位符第一个字符都是%,第二个字符表示占位符的类型
*一个文本可以有多个占位符
int main()
{
printf("%s says it is %d o'clock\n","wangwu",21);
return 0;
}
注意:参数与占位符是一一对应的关系
*占位符列举:
%c 字符
%s 字符串
%a 十六进制浮点数
%d 十进制整数
%f 小数。//float %f ,double %lf
%hd 十进制短整型short int
%ld 十进制长整型long int
%lu unsigned long int类型
%指针
%u 无符号整数unsigned int
%zd size_t类型(size of的返回类型)
% %输出一个%
3)输出格式:printf()可以定制占位符的输出格式
*限定宽度%xd
示例:%5d (最少)打印五个字符
输出的值默认是右对齐,即如果在%5d中输入123,得到的结果是"(空格)(空格)123”;如果想要改成左对齐,可以在%后面加一个负号(%-5),这样得到的结果就是123(空格)(空格)
对于小数,这个限定符会限制所有数字的最小显示宽度。
示例:%12f 如果输入123.45这个数,由于小数的默认显示精度是小数点后六位,所以输出结果的头部会加两个空格
*总是显示正负号
默认printf不对正数显示+号,只对负数显示-号。如果想要正数显示+号,就写成:%+d
*限定小数位数
如果希望小数点后面只保留两位,占位符可以写成%.2f
这种写法可以与限定宽度占位符结合使用
//输出为" 0.50" 数前面有两个空格
#include<stdio.h>
intmain()
{
printf("%6.2f\n",0.5);
return0;
}
*输出部分字符串
%s占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤%.[m]s指定输出
的⻓度,其中[m]代表⼀个数字,表⽰所要输出的⻓度。
占位符%.5s表⽰只输出字符串“hello world”的前5个字符,即“hello”。
9.2scanf输入函数
int main()
{
int score=0
printf("请输入成绩');
scanf("%d",&score); //&是取地址符号
printf("成绩是:%d\n",score);
return 0
}
1)基本用法:scanf函数用于读取用户的键盘操作
程序运行到这个语句时就会停下来等待用户的键盘输入,用户输入后按下回车,scanf就会处理用户的输入,将其存入变量
scanf("%d",&i)
scanf()必须提前知道用户输入的数据类型才能处理数据,其余参数就是存放用户输入的变量,格式字符串里有多少个占位符就有多少个变量
int main()
{
int i=0;
int j=0;
float x=0.0f;
float y=0.0f;
scanf("%d%d%f%f",&i,&j,&x,&y);
printf("i=%d\n",i);
printf("j=%d\n",j);
printf("x=%d\n",x);
printf("y=%d\n",y);
return 0
}
-注意输入数据的时候要用空格断开,一个或多个都可以
-scanf处理用户数据的原理:用户的输入先放人缓存,等到按下回车键后,按照占位符对缓存进行解读。
解读时,会从上一次解读遗留的第一个字开始,到读完或者遇到第一个不符合条件的字为止
2)scanf()的返回值是一个整数,表示成功读取的变量的个数
如果没有读取任何项\匹配失败,则返回0
如果在成功读取任何数据之前,发生了读取错误或读到文件末尾,则返回EOF(-1)
#include<stdio.h>
intmain()
{
inta =0;
intb =0;
floatf =0.0f;
intr =scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("r = %d\n", r);
return0;
scanf的返回值的理解很有用
在OJ的刷题中,有多组输入场景的时候,可能会用到
(OJ:online jugde网页上写代码,网页上提交)
现在出去找工作的时候,笔试基本上都是在线OJ,所以要熟悉OJ做题的方式
3)占位符(与printf的基本一致)
%c
%d
%f
%lf: double
%Lf: long double
注意:除了%c以外,其他的占位符都会自动忽略空格
如果要强制跳过字符前的空白字符,只需要在%c的前面加上一个空格,即跳过一个或多个空白字符
*特别说明一下%s,他不能简单的等同于字符串。它的规则是,从第一个非空白字符开始,知道遇到空白字符(空格,换行符,制表符等)为止,这意味着scanf不适合用来读取多个单词
另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0
scanf将字符串读入字符数组时,不会检测字符串是否超过数组长度,从而储存字符串时会可能会超过数组边界,从而出现错误。
因此,使用%S时,应该指定输入字符串的最长长度,即写成%[m]s,其中[m]是一个整数,表示读取字符串的最大长度,后面的字符应该被丢弃
int main()
{
char arr[11]={0};
scanf("%s",arr); (这里没有写&arr,因为数组名arr就是地址)
printf("%s",arr);
return 0
}
4)scanf函数在VS上的报错:
VS说scanf函数不安全,建议使用scanf_s
但初学时不建议使用scanf_s,因为它VS2022提供的,其他的编译器不认识,降低了代码的可移植性
解决办法:只要在使用scanf函数的.c文件的第一行加上:#define _CRT_SECURE_NO_WARNINGS 1
一劳永逸:在VS上新建.c\.cpp文件的时候,拷贝的是一个固定文件:newc++file.cpp
只要在这个文件中加上就一劳永逸了
赋值忽略符
有时候,用户的输入可能不符合预订的格式
#include<stdio.h>
intmain()
{
intyear =0;
intmonth =0;
intday =0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return0;
上⾯⽰例中,如果⽤⼾输⼊2020-01-01,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他
格式,⽐如2020/01/01,这种情况下,scanf()解析数据就会失败。
为了避免这种情况,scanf()提供了⼀个赋值忽略符*。
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
#include<stdio.h>
intmain()
{
intyear =0;
intmonth =0;
intday =0;
scanf("%d% * c%d% * c%d", &year, &month, &day);
printf("%d-%d-%d",year,month,day);
return0;
}
这时,不管输入2023 12 21还是2023/12/21,都可以正确的输出2023-12-21


被折叠的 条评论
为什么被折叠?



