1-数据类型-常量-变量
1.1符号常量
#include<stdio.h>
//1-符号常量
#define PI 3+2 //不用在最后加分号
int main()
{
int i = PI * 2; //i就是一个整形变量 变量i是4个字节
printf("i=%d\n", i);
printf("i size=%d\n", sizeof(i)); //sizeof用来计算变量i的大小
return 0;
}
//最终输出结果是7,原因是符号常量PI是直接替换的效果,因此不可以写成PI=8
1.2float-浮点型常量
//浮点型常量
/* 表示方法:
小数形式:0.123
指数形式:3e-3(为3*10-3次方 即0.003)
注意:字母e(或E)之前必须有数字,且e后面的指数必须为整数.
正确示例:1e3 1.8e-3 -123e-6
错误示例:e3 2.1e3.5 .e3
通过float来定义浮点型变量 f占用4个字节空间大小
*/
#include<stdio.h>
int main()
{
float f = 3e-3;
printf("f=%f\n", f);//字符型使用%f来进行输出
return 0;
}
1.3字符型数据
使用单引号括起来的一个字符是字符型常量,且只能包含一个字符! 例如:'a' 'A' '1' ' '是正确的字符型常量,而'abc' "a" " "是错误的字符型常量
转义字符:\n 表示换行 \b 表示退格 \ 表示反斜杠
1.4字符变量
/*字符型变量 大写字符转换小写字符*/
#include<stdio.h>
int main()
{
char c = 'A';
char b = 'a';
printf("%c\n", c + 32);//大写转换成小写字符 以字符形式输出
printf("%c\n", b - 32);//小写转换成大写字符
printf("%d\n", c);//以数值形式输出
return 0;
}
1.5字符串型常量
字符串型常量是由一对双引号括起来的字符序列.例如'a'是字符型常量,"a"是字符串常量.两者是不同的 在C语言中规定在每个字符串常量的结尾加一个字符结束标志,以便系统据此判断字符串是否结束.C语言规定以"\0"作为字符串结束标志.因此在计算字符串占用的内存单元时要加上\0.例如"CHINA"占用的不是5个字符,而是6个字符,大小为6个字节
2-混合运算-printf讲解
2.1 混合运算-强制类型转换场景
整数进行触发运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类型转换
#include<stdio.h>
//强制类型转换
int main()
{
int i = 5;
float f = i / 2;//以整数输出 这里做的是整型运算,因为左右操作数都是整型
float k = (float)i/2;//强制类型转换 以小数输出
printf("%f\n", f);
printf("%f\n", k);
return 0;
}
2.2 printf函数的介绍
printf函数可以输出各种类型的数据,包括整型、浮点型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后将结果显示在屏幕上
语法:
#include<stdio.h>
/* %c:输出字符 %d:输出带符号的整数 %s:输出一串字符 %f:输出浮点数即小数*/
//语法:int printf(const char* format, ...);
int main()
{
int age = 21;
printf("Hello %s,you are %d years old\n", "Bob", age);
//%s表示在该位置插入首个参数(一个字符串),%d表示第二个参数(一个整数)应该放在那里.
int i = 1001;//第一次定义了i
float f = 96.3;
printf("student number = %3d,score = %5.2f\n", i, f);//3d表示输出结果占三个空格
i = 100;//第二次不用定义i直接使用第一次定义的就可以
f = 98.21;
printf("student number = %-3d,score = %5.2f", i, f);//.2表示小数点后保留两位 -3d表示向左对齐三个空格
return 0;
}
3-整型进制转换
/*在计算机中,1字节(byte)为8位(bbit),1位即二进制的1位,它存储0和1,int型常量的大小是4字节,即32位
二进制 0和1 转八进制(每三个数为一位)
十进制 0-9 123 转十六进制 123/16 =7..11(11在十六进制里面就是b)=7b 就是用这个十进制数除16 转八进制就除八
八进制 0-7 转二进制 例如:173 =1*8*8+7*8+3=64+56+3=123
十六进制0-9 a-f
1KB = 1024字节(byte)
1MB = 1024KB
1GB = 104MB
*/
#include<stdio.h>
int main()
{
int i = 123;//一般赋值都是十进制 八进制 十六进制 没有二进制一说
//int i = 0123;//八进制赋值
//int i = 0x7b;//十六进制赋值
printf("%d\n", i);//以十进制输出 化为二进制使用短除法(除2)
printf("八进制=%o\n", i);//一八进制输出
printf("十六进制=%x\n", i);//一十六进制输出
return 0;
}
//为什么显示结果为7b 00 00 00 呢? 原因是英特尔的CPU采用了小端方式进行数据存储,因此低位在前,高位在后
4-scanf函数的标准输入
scanf函数的原理
/*scanf函数读取标准输入 scanf %d %f 发现里边有\n 空格,忽略
scanf %c 不忽略内容
*/
#include<stdio.h>
#pragma warning(disable:4996)
//scanf用来读取标准输入,scanf把标准输入内的内容,需要放到某个变量空间里,因此变量必须取地址
int main()
{
int i;
char c;
float f;
scanf("%d", &i); //一定要取地址
printf("i=%d\n", i);
rewind(stdin);//清空标准输入缓冲区写在两个scanf函数之间 如果不写该函数的话在执行结果时控制台直接输出两个结果 在visualStdio2022环境中将fflush改成rewind
//fflush(stdin); //清除标准输入缓冲区 在CMakeLists环境中使用,在visaolstdio环境不起作用
scanf("%c", &c);//如果没有写rewind(stdin)函数,这一步就会阻塞
printf("c=%c\n", c);
scanf("%f", &f);
printf("f=%f", f);
return 0;
}
出现如下的执行结果是没有将上面的rewind(stdin)函数打开,此时scanf("%c",&c)会阻塞,原因是我们向标准输入缓冲区中放入字符为'20\n',输入'\n'(回车)后,scanf函数才开始匹配,scanf函数中的%d匹配整数20,然后放入变量i中,接着打印输出,这是'\n'仍然在标准输入缓冲区(stdin)内,如果第二个scanf函数为scanf("%d",&i),那么依然会发生阻塞,因为scanf函数在读取整型数、浮点数、字符串时会忽略\n(回车)、空格等字符(忽略是指scanf函数执行时会首先删除这些字符,然后在阻塞).scanf函数匹配一个字符时,会在缓冲区删除对应的字符.因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'.总的来说就是%d %f输出是不用写rewind(stdin)函数会阻塞 而用%c输入时要加rewind(stdin)函数
scanf混合输入多种数据局类型
#include<stdio.h>
#pragma warning(disable:4996)
//scanf一次读取多种数据类型
int main()
{
int i, ret;
float f;
char c;
ret = scanf("%d %c%f", &i, &c, &f); // ret是scanf匹配成功的个数
printf("i=%d,c=%c,f=%5.2f\n", i, c,f);
return 0;
}
5-运算符与表达式
5-1 算术运算符与关系运算符的使用
#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a))
{
if (3 < a && a < 10)//a大于3同时a小于10要这样写
{
printf("a is between 3 and 10\n");
}
else
{
printf("a is not between 3 and 10\n");
}
}
return 0;
}
5-2 逻辑运算符与赋值运算符,求字节运算符
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
//判断闰年
int main()
{
int year;
while(1)
{
printf("请输入你要查询的年份:\n");
scanf("%d", &year);
if(year%4==0&&year%100!=0 ||year%400==0)
{
printf("%d is lead year\n",year);
}
else
{
printf("%d is not lead year\n",year);
}
}
return 0;
}
短路运算
#include<stdio.h>
#include<stdlib.h>
//逻辑与和逻辑或 短路运算
int main()
{
int i = 0; // 0 表示假 1表示真
i&& printf("you can't see me !\n");//短路运算 :当i为假时,不会执行逻辑与后的表达式,称为短路运算
i = 0;
i || printf("you can see me !\n");
//相当于if判断条件的真假
/*if(i)
{
printf("you can't see me !\n");
}
else
{
}*/
return 0;
}
加后赋值与乘后赋值运算符使用
#include<stdio.h>
//加后赋值与乘后赋值用法
int main()
{
int a = 1, b = 2;
a += 3; //a = a + 3; //正确写法
b *= 5; // b = b*5;
//b + 2 = a;// 错误写法
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
求字节运算符
#include<stdio.h>
#include<stdlib.h>
//sizeof实际是一个运算法,很多人会将它认为是函数 他不是函数
int mian()
{
int i;
printf("i is %d\n", sizeof(i));
return 0;
}
6选择--循环
if -else语句
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
while(1)
{
scanf("%d", &i);
if(i>0)//良好的编程习惯,在if下边使用大括号 让代码更加的清晰
{
printf("i is bigger than 0\n");
}
else
{
printf("i is not bigger than 0\n");
}
}
return 0;
}
while、for循环
#include<stdio.h>
//while循环,先循环在执行语句
int main()
{
int i = 1;
int sum = 0;//计算从1-100的和
while(i<=100)
{
sum += i; //或者sum = sum + i;
i++; //等价于i = i + 1 没有这一步就会进入死循环了
}
printf("sum = %d\n", sum);
return 0;
}
#include<stdio.h>
//for循环
int main()
{
int i, sum;
//初始化
for(i = 1;i<=100;i++)//相比while循环for循环在一条语句内完成初始化 for循环的好处是不会让编程者忘记i++这一步操作从而忘记表达式二i<=100进行假的操作
{
sum += i;//等价于sum = sum + i
}
printf("sum = %d\n", sum);
return 0;
}
//使用for循环还是使用while循环根据个人编程喜欢和解决问题的效率来选择
#include<stdio.h>
//continue语句的作用:结束本次循环,即跳过循环体中下面尚未执行的语句,接着是否进行下一次循环的判断
//求1-100的奇数和
int main()
{
int i, sum = 0;
for(i = 0;i<=100;i++)//在for后面加分号不会死循环,会结果不对
{
if(i%2==0)
{
continue;//continue下面的语句不会得到执行 直接跳出循环体 直接执行printf函数
}
sum = sum + i;
}
printf("sum=%d\n", sum);
return 0;
}
break语句
/*break语句的作用是结束整个循环过程,不在判断执行循环的条件是否成立*/
#include<stdio.h>
int main()
{
int i, sum = 0;
for(i=1;i<=100;i++)
{
if(i>2000)
{
break;
}
sum += i;//sum = sum + i
}
return 0;
}