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 : 跳出本次循环,进入下一次循环