7-15 day2
数据类型转换
1.显示转换(强转) ---程序员
(数据类型)表达式;
(int)5.0 + 3.0;
2.隐式转换 ---系统
(1)运算时
5 / 2 = 2;
5.0 / 2 = 2.5;
(2)赋值运算符时,等号右边数据类型会自动转换成左边的数据类型
int a = 5 / 2; --- 2
int a = 5 / 2.0; --- 2
float a = 5 / 2; --- 2.0
float a = 5.0 /2; --- 2.5
注意:
隐式转换大部分是低精度转高精度
高精度转低精度会存在丢失数据精度的问题
变量
在程序运行时可以被改变的量
在程序运行时,变量占据一定大小的存储空间,其大小由其数据类型来决定的,作为某变量的内存空间的首地址,称为变量的地址
变量定义的一般形式:
存储类型 数据类型 变量名
<存储类型>可以是关键字auto、register、static、extern之一
(1)auto : 自动存储类型(由操作系统自动开辟空间,自动回收资源)
(2)register : 寄存器存储类型,存储在CPU的寄存器当中,作用:处理数据效率高,但由于寄存器资源有限,编译器会做优化处理,会导致申请资源失败,失败后自动转换成auto存储类型
(3)static : 静态存储类型,
1) 局部变量
1、只能初始化1次
2、存储位置变为全局的静态区域
3、生命周期变为随程序结束而结束
2) 全局变量
1、限制全局变量的作用域只在本文件中
(4)extern : 外部存储类型
1、引入其他文件的全局变量
<数据类型>分为基本数据类型,也可以是自定义数据类型等
<变量名>
命名规则:
1、只能由数字、字母、下划线组成
2、不能数字开头
3、不能与关键字重名
全局变量:
位置 : 在main函数的外面
存储位置 : 全局变量区(全局静态区)
作用域 : 整个文件
生命周期 : 随程序结束而结束
如果没有初始化,默认值为0
局部变量:
位置 : 在函数内部
存储位置 : 栈区
作用域 : 函数、模块内部
生命周期 : 随函数、模块结束而结束
如果没有初始化,初值为随机数
初始化: 在定义变量的时候,给变量赋值
int a = 10;
赋值:
int a; //定义
a = 10; //赋值
虚拟内存分配图
输入输出
#include <stdio.h>
1、putchar
int putchar(int c);
2、getchar
int getchar(void); //从键盘读取一个字符
返回值 : 接收到的字符的ASCII码值,出错或者结束返回-1
3、scanf(格式化输入)
格式 : scanf("格式控制符",地址);
功能 : 按照指定格式从键盘读入数据,存入指定的地址的空间
按下回车结束
返回值 : 正常返回输入的数据的格式个数
地址 : 变量的地址,常用取地址符控制
总结 : 输入数据时,遇到以下情况会认为该数据结束
1.空格、TAB、回车
2、非法输入
3、宽度结束
清除残留符号:getchar();
scanf连续输入字符:
%ld 长整型 %lf 双精度浮点型
4、printf
int printf(const char *format,....);
格式 : printf("格式控制符",输出表);
功能 : 按照指定格式输出数据
输出表 : 要输出的数据
格式说明 : %[修饰符]格式字符,用于指定输出格式
eg :
//1.原样输出
printf("hello world\n")
//2.格式输出
int a = 97;
int b = 98;
printf("a:%d b:%d\n",a,b);
printf("a:%x b:%x\n",a,b);
//3.带修饰符输出
int num = 1234;
printf("%7d",num); //输出: " 1234";
printf("%-7d",num); //输出: "1234 "; -符号表示右边填充
float num = 3.1415926;
printf("%.2f",num); //输出: "3.14"; 小数点后保留2位
char str[] = {"hello world"};
printf("%.5s\n",str); //输出: "hello" 限制字符串输出长度
printf("%ld\n",num); //输出长整型 ld为长整型的表示方式
格式控制符与输入一致,但会有特殊类型
格式符 | 作用 |
---|---|
g | e和f中较短的一种 |
%% | 百分号本身 |
修饰符
修饰符 | 功能 |
---|---|
m | 输出数据域宽度,数据长度<m,左边补空格,否则按照实际输出 |
.n | 对实数来说,指定小数点后的位数(四舍五入),对字符串指定实际输出的位数 |
- | 输出数据在域内左对齐(缺省右对齐) |
+ | 指定在有符号数的整数前显示(+)正号 |
0 | 输出数值时,指定左边不使用的空位置自动填0 |
# | 在八、十六进制之前显示前导的0,0x |
l | 用于d,o,x前面,制定输入Long整数,e,f前面,指定输入double实数 |
* | 抑制符号,指定输入项读入后不予以赋值 |
h | 用于d,o,x前面,指定输入short整数 |
5、gets
字符串输入函数
char *gets(char *s);
功能 : 从键盘获取输入的字符串,并自动+'\0',回车结束
与scanf 不同的是,gets不以空格为结束
6、puts
字符串输出函数
int puts(const char *s);
功能 : 输出字符串,且自动换行;
说明 : 字符数组一定要以'\0'结束
转义字符
C语言结构
顺序结构
分支结构
循环结构
1、选择结构
if elseif else
1.单分支
if(表达式)
{
代码块
}
2.双分支
if(表达式1)
{
代码块1
}
else if(表达式2)
{
代码块2
}
else
{
代码块3
}
3.多路分支 n各else if
switch case default break
格式:
switch(变量) //变量只能是整型的表达式
{
case 常量表达式1:
代码块1;
break;
case 常量表达式2:
代码块2;
break;
default: //default无条件执行
代码块n;
break;
}
2、循环结构
goto
goto语句构成循环
跳转到对应的标签处
goto 标签;
会破坏栈逻辑,一般用来做一些程序的调试错误处理
while(先判断,在执行)
while(表达式) //表达式为true就执行,为false就退出循环
{
//循环体
}
//经常用来完成一个不会结束的死循环
do while(先执行,再判断)
do
{
//循环体
}while(表达式)
for
for(表达式1;表达式2;表达式3)
{
//循环体
}
表达式1 : 只执行一次,通常用来初始化循环条件
表达式2 : 用作循环判断条件
表达式3 : 会在每次循环完成之后,执行操作,通常用来控制循环体变量的更新
3、循环分支——辅助关键字
break : 跳出某一结构,循环、switch
continue : 跳出本次循环,进入下一次循环