今天早晨没有带雨伞,怀着迫切的心情冒雨来上课。
对于有符号数或者无符号数,超出范围,用回环。
类型转换:
强制类型转换 将浮点型转换为整型等
#include<stdio.h>
int main()
{
float a=3.453332;
int b=(int)a;
printf("%d",b);
return 0;
}
隐式类型转换
发生在数据运算的内部,自动发生类型转换
#include<stdio.h>
int main()
{
int a=20;
float b=30;
printf("%f",a+b);
return 0;
}
有符号向无符号转换
#include<stdio.h>
int main()
{
int a=-10;
unsigned int b=-100
printf("%u",a+b);
return 0;
}
#include<stdio.h>
int main()
{
int a=-10;
unsigned int b=-100;
printf("%d",a+b); // -100
return 0;
}
输入输出
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
printf("%d",a);
return 0;
}
为啥scanf要用取地址?把数字放到存储空间中,但内存中可能存在相同名字的空间,因此要把数据准确放到我想要的空间,即知道空间的地址。
格式控制符:
%d int类型
%m.nd m控制对齐的方式 %-m.nd(左对齐) %m.nd(右对齐)
#include<stdio.h>
int main()
{
int a=10;
printf("%-5.4d",a); // 有效数字为4
printf("%5.4d,"a);
return 0;
}
%c 字符格式控制符
#include<stdio.h>
int main()
{
char a;
char b;
scanf("%c%*c%c",&a,&b);
// scanf("%c%c\t",&a,&b);
printf("%c,%c",a,b);
// printf("%c,%c\t",a,b);
return 0;
}
%*c的作用是抑制一个字符生效,该字符可为任意字符
%t是转义字符,代表一个TAB
%c是转义字符,代表一个换行
%s
#include<stdio.h>
int main()
{
char a[]={‘\0’};
scanf("%c",a);
printf("%c\t",a);
return 0;
}
%f 打印浮点型数据
#include<stdio.h>
int main()
{
float a=3.1415926;
printf("%4.2f",a);
// printf("%-4.6f",a);
return 0;
}
%m.nf 当m或n是正数或者负数,只是控制域宽,不需要对齐
当n小于m的时候,跟着域宽的大小走
当n大于m的时候,跟着n的大小走
%o 打印八进制
%x 打印十六进制
#include<stdio.h>
int main()
{
int a=100;
printf("%#o,%#x",a,a);
return 0;
}
字符输入
getchar 获得字符
putchar/putc 输出字符
gets 获得字符串 输入不定量的字符,容易造成段错误
puts 从标准输出上显示字符串
#include<stdio.h>
int main()
{
char a;
a=getchar();
putchar(a);
return 0;
}
常量的值在程序运行过程中不能发生改变
整型常量:
十进制:97
八进制:076
十六进制:0xab
字符常量:
用单引号包裹起来的量:'a' '*' '1' '5'
字符串常量:
用双引号包裹起来的量:"abcd" "*&A"
小数型常量:
浮点型:3.14
指数型:2e+7
宏常量:
当宏是数字的时候,只是一个简单的名字
当宏是表达式的时候,是一个带参数的名字
#define PI 3.1415
#include<stdio.h>
#define PI 3.1415
// define add(x,y) x+y
define add(x,y) (x+y)
int main(int argc,const char *argv)
{
double a=10000;
double b=a*a*PI;
double c=add(e+f)*add(e+f);
double e=3.0;
double f=4.0;
printf("%f",b);
printf("%f",c);
return 0;
}
变量
存储类型 数据类型 变量名
存储类型:需要在内存的什么地方开辟空间
数据类型:开辟多大的空间
堆区:程序员自己开辟malloc和释放free空间的区
栈区:存放局部变量和局部参数
数据段:存放的是未被初始化过的全局变量
存储类型的四个关键字
auto:修饰的是局部变量,可以省略,为默认的存储类型
register:被修饰的变量叫寄存器变量,放在寄存器当中
static:被修饰的变量叫做静态变量
extern:引用外部变量
变量又可以分为全局变量和局部变量
局部变量:在main函数内部定义的变量。对于局部变量来说,不进行初始化和赋值,出现的结果是随机数
全局变量:在main函数外部定义的变量
初始化:在定义变量的时候就已经给好值 int a=10
赋值:先定义,再给值 int a;a=10
对于全局变量
#include<stdio.h>
int a;
int main()
{
printf("%d",a);
return 0;
}
对于全局变量来说,不进行初始化和赋值,结果就是0
对于局部变量来说,不进行初始化和赋值,结果是随机数
#include<stdio.h>
int main()
{
int i=0;
for(i=0;i<5;i++)
{
int sum=1;
sum=sum+i;
printf("sum=%d",sum);
}
return 0;
}
0 1 2 3 4
1 1 1 1 1
#include<stdio.h>
int main()
{
int i=0;
for(i=0;i<5;i++)
{
static sum=1;
sum=sum+i;
printf("sum=%d",sum);
}
return 0;
}
0 1 2 3 4
1 1 2 4 11
被static修饰的局部变量,相当于延长了局部变量的生命周期
现在下课休息,玩了会《战争游戏 红龙》,这样做叫做劳逸结合!
现在开始上课了
认真听课!
static修饰的全局变量,从定义的变量开始,到整段程序结束
#include<stdio.h>
int a=10;
// static int a=10;
int b=20;
#include<stdio.h>
extern int a;
extern int b;
int main()
{
int c=a+b;
printf("%d",c);
return 0;
}
用static修饰的全局变量,无法被引用,用static修饰的全局变量缩小了作用域(用extern引用的外部变量)
生命周期:离变量最近的上面的前括号开始,到跟这个前括号匹配的到后括号结束
作用域:在那个文件内有效
被static修饰的局部变量,延长了生命周期
被static修饰的全局变量,缩小了作用域
全局变量和局部变量是否可以重名?
可以,重名的时候优先使用局部变量,当局部变量生效的时候,再使用全局变量
运算符
算术运算符:+ - * / %(只能用于整型)
逻辑运算符:
&&(全真则真,当两个条件前面为假时,直接截断,整个表达式的值为0)
||(只要有一个为真,就为真)
关系运算符:< > <= >= ==
三步运算符:c=a>b?a:b
逗号运算符:将最后一个表达式的值作为整个表达式的值
在a=1时,经过一次++a之后要进行两步运算,先给a自加a=a+1,然后再将a的值整体赋值给++a
在a=1时,经过一次a++之后要进行两步运算,先把a的值赋值给++a,再给a的值加1
备注:Linux终端的命令行模式 vsp zzzz.c 新打开一个文件
2022年9月20日
徐子宸