c语言学习-2
一、数据类型与运算符
1.常量与变量
#include<stdio.h> //引用文件
#define PI 3 //PI就是符号常量
int main()
{
int a = 3;//a就是一个变量
a = 5;
//PI = 10;//符号常量不可以赋值
printf("%d\n", PI);
return 0;
}
3
D:\cbook\数据类型与运算符\Debug\1.常量与变量.exe (进程 708)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
2.scan的使用
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
int main()
{
int a,b;
scanf("%d%d", &a,&b);//一定要在变量前加入&符号
printf("a=%d,b=%d\n", a,b);
printf("a+b=%d\n", a+b);
return 0;
}
11 13
a=11,b=13
a+b=24
D:\cbook\数据类型与运算符\Debug\2.scan的使用.exe (进程 18264)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
3.进制变换
#define _CRT_SECURE_NO_WARNINGS //解决scanf报错问题
#include<stdio.h>
/*
观察内存使用的十六进制
123 十进制
111 1011 二进制
7B 十六进制
173 八进制
00 00 00 7b 英特尔x86架构是小端存储(英特尔还是AMD),低位在前,高位在后
为什么内存数据要用十六进制去看,就是非常高效,两个字符就可以表示一个字节
1位 1bit 存储0或者1
1字节 1 byte = 8bit
1Kb = 1024 字节
1Mb = 1024 Kb
1Gb = 1024 Mb
磁盘1G=1000 000 000 字节
64位cpu
32位
0x00 7D FD 04 地址是4个字节
2 的 32 次方,是 1024 * 1024 * 1024 * 4 = 4G
*/
int main()
{
//int i,变量i是4个字节,32位
int i = 123;//十进制
int a = 0x7b;//十六进制
int b = 0173;//八进制
printf("a=%d\n", a);//%d以十进制方式去输出某一个整型数
printf("b=%d\n", b);
printf("i=%d\n", i);
return 0;
}
a=123
b=123
i=123
D:\cbook\数据类型与运算符\Debug\3.进制变换.exe (进程 1736)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
4.浮点型与字符型
#include<stdio.h>
int main()
{
//通过float f来定义浮点变量,f占用4个字节的空间
float f = 1.234;
float a = 3e-3;//e代表10的幂次
float b = 3e3;
printf("输出的浮点数 f=%f\n", f);//%f就是以浮点形式输出对应数据
printf("输出的浮点数 a=%f\n", a);
printf("输出的浮点数 b=%f\n", b);
char c = 'a';//定义一个字符型变量,并赋值为 'a',一个字符变量占用1个字节大小的空间
printf("c=%c\n", c);
printf("c=%c\n", 97);
return 0;
}
输出的浮点数 f=1.234000
输出的浮点数 a=0.003000
输出的浮点数 b=3000.000000
c=a
c=a
D:\cbook\数据类型与运算符\Debug\4.浮点型与字符型.exe (进程 14388)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
5.字符型大小写转换
#include<stdio.h>
/*
'a'是字符型常量
“a”是字符串常量,如“hello word”
*/
int main()
{
char c = 'a';//现在是小写字母a,要变成大写字母A
c = c - 32;
printf("c = %c\n", c);//以字符形式来输出c
return 0;
}
c = A
D:\cbook\数据类型与运算符\Debug\5.字符型大小写转换.exe (进程 14952)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
6.混合运算
#include<stdio.h>
#include<stdlib.h>
//混合运算,从长字节到短字节数据需要强制类型转换
int main()
{
int i = 5;
float f, g;
short m;
long l = 5;
f = i / 2;//因为没有强制类型转换i/2表达式为整型运算
g = (float)i / 2;
m = (short)l + 2;//不加short强制编译会警告
printf("i=%d\nf=%f\ng=%f\nm=%d\n", i, f, g, m);
return 0;
}
i=5
f=2.000000
g=2.500000
m=7
D:\cbook\数据类型与运算符\Debug\6.混合运算.exe (进程 9092)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
#include<stdio.h>
//混合运算,从长字节到短字节数据需要强制类型转换
int main()
{
int i = 5;
float j = i / 2;//输出的j是2还是2.5,答案是2
float k = (float)i / 2;//k输出是2.5,强制类型转换
printf("i=%d\nj=%f\nk=%f\n", i, j, k);
return 0;
}
i=5
j=2.000000
k=2.500000
D:\cbook\数据类型与运算符\Debug\6.1混合运算.exe (进程 13200)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
7.scanf读取标准输入缓冲区的原理
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
/*
scanf读取的是标准输入
printf输出到黑窗口(控制台),输出到了标准输出
scanf使用方法
#include<stdio.h>
int scanf( const char * format, ... );
format 是一个字符串, ...是可变参数,参数的数目和format中的%的数目保持一致
%d 一个十进制数
%f 一个浮点数
%c 一个单一的字符
%d ,%f ,%c 不限制出现次数
"%d%d%d",&a,&b,&c
*/
int main()
{
int i;
scanf("%d", &i);
printf("i=%d\n", i);
return 0;
}
11
i=11
D:\cbook\数据类型与运算符\Debug\7.scanf读取标准输入缓冲区的原理.exe (进程 10532)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
int main()
{
int i;
char c;
scanf("%d", &i);
printf("i=%d\n", i);
scanf("%c", &c);
printf("c=%c\n", c);
return 0;
}
10
i=10
c=
D:\cbook\数据类型与运算符\Debug\7.scanf读取标准输入缓冲区的原理.exe (进程 11744)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
缓冲区为空的时候,scanf才会卡住(阻塞)
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,将执行真正的I/O操作。
这时,我们输人的字符先存放到缓冲区中,等按下回车键换行时才进行实际的IO操作。
典型代表是标准输入缓冲区(stdin)和标准输出缓冲区(stdout) .
如图所示,我们向标准输入缓冲区中放入的字符为'10\n',输入'\n’(回车)后,scanf 函数才开始匹配,
scanf函数中的%d匹配整型数10,然后放入变量i中,接着进行打印输出,这时'\n'仍然在标准输入缓冲区(stdin)内,
如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为 scanf函数在读取整型数、浮点数、字符串
(后面介绍数组时讲解字符串)时,会忽略'n'(回车符)、空格符等字符
(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞) 。
scanf函数匹配一个字符时,会在缓冲区删除对应的字符。
因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'n'。
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
int main()
{
int i,j;
float f;
scanf("%d", &i);
printf("i=%d\n", i);
scanf("%f", &f);
printf("f=%f\n", f);
scanf("%d", &j);
printf("j=%d\n", j);
return 0;
}
8.scanf读取两个整型数
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
/*
%d和%f都是忽略空格
*/
int main()
{
int a, b;
scanf("%d%d", &a, &b);
printf("a+b=%d\n", a + b);
return 0;
}
12 45
a+b=57
D:\cbook\数据类型与运算符\Debug\8.scanf读取两个整型数.exe (进程 3524)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
9.判断闰年
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
int main()
{
int year;
scanf("%d", &year);
if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
{
printf("yes\n");
printf("%d是闰年\n", year);
}
else {
printf("no\n");
printf("%d不是是闰年\n", year);
}
return 0;
}
2000
yes
2000是闰年
D:\cbook\数据类型与运算符\Debug\9.判断闰年.exe (进程 18460)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
10.scanf函数的循环读取
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
/*
scanf()读取配置format(格式)字符串的输入.当读取到一个控制字符,它把值的置到下一个变量,
空白(tabs,空格等等)会跳过.非空白字符和输入匹配,然后丢弃,如果是一个在%符号和控制间的数量,
那么只有指定数量的字符转换到变量中,如果scanf()遇到一个字符集(用%[]控制字符表示),
那么在括号中的任意字符都会读取到变量中,scanf()的返回值是成功赋值的变量数量,发生错误时返回EOF.
scanf 循环读取发生错误时返回EOF
直接输入EOF,按着ctrl,鼠标左键点击,原来EOF就是-1
Windows什么情况下scanf会出错?
行首输入ctrl z,回车
行首输入ctrl z,回车
行首输入ctrl z,回车
3次
*/
// 清空标准输入缓冲区,VS2012 fflush(stdin)
//stdin是标准输入
//VS2013-VS2019清空标准输入缓冲区,用rewind
int main()
{
int i;
int ret;//用来获取scanf的返回值
while (rewind(stdin), (ret = scanf("%d", &i)) != EOF)
{
printf("i=%d\n", i);
printf("ret=%d\n", ret);
}
return 0;
}
10
i=10
ret=1
15
i=15
ret=1
a
i=15
ret=0
b
i=15
ret=0
200
i=200
ret=1
D:\cbook\数据类型与运算符\Debug\10.scanf函数的循环读取.exe (进程 18664)已退出,代码为 -1。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
加上rewind(stdin),清空缓冲区就不会疯狂打印
11.scanf读取字符串打印
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
//一行的内容要进行循环读取时,不要使用fflush
//读取字符串并打印对应字符串的大写字母
int main()
{
char c;
while (scanf("%c", &c) != EOF) {//读取字符串
if (c != '\n')
{
printf("%c", c - 32);
}
else {
printf("\n");
}
}
return 0;
}
helloworld
HELLOWORLD
^Z
^Z
D:\cbook\数据类型与运算符\Debug\11.scanf读取字符串打印.exe (进程 9320)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
12.多种数据类型混合输入
#define _CRT_SECURE_NO_WARNINGS //解决2019版本scanf报错问题
#include<stdio.h>
#include<stdlib.h>
//一个scanf读多种类型的数据
// 混合输入时每次在%c之前需要加入一个空格
//整型,字符,浮点型混合输入
int main()
{
int i = 5;
double f;
float l;
char c;
int ret;
ret = scanf("%d %c%lf%f", &i, &c, &f, &l);
printf("i=%d\nc=%c\nf=%lf\nl=%f\nret=%d\n",i,c,f,l,ret);
return 0;
}
15 a12.3 2.5
i=15
c=a
f=12.300000
l=2.500000
ret=4
D:\cbook\数据类型与运算符\Debug\12.多种数据类型混合输入.exe (进程 16712)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
15 a 5.6 12.3
i=15
c=a
f=5.600000
l=12.300000
ret=4
D:\cbook\数据类型与运算符\Debug\12.多种数据类型混合输入.exe (进程 16032)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .
13.printf的使用
#include<stdio.h>
//printf控制输出格式
int main()
{
int i = 10;
float f = 99.5;
printf("score=%f\n", f);
printf("name=%s,age=%d,sex=%c,score=%4.1f\n", "Admin", 34, 'a', f);
printf("score=%5.2f\n", f);
printf("\n");
printf("student number = %3d\n", i);
printf("student number = %-3d\n", i);
printf("%10s\n", "hello");
return 0;
}
score=99.500000
name=Admin,age=34,sex=a,score=99.5
score=99.50
student number = 10
student number = 10
hello
D:\cbook\数据类型与运算符\Debug\13.printf的使用.exe (进程 5520)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .