局部变量 | 全局变量 | |
定义位置 | 函数内部 | 函数外部 |
初始值(不赋值) | 值:随机值 | 值:0 |
作用域 | 整个函数中都可以 | 整个程序中都可以 |
存储位置 | 栈区 | 全局存储区 |
生命周期 | 同整个函数共存亡 | 同整个程序共存亡 |
[2]常量
概念:在程序的运行中不会发生变化的量
分类:
● 字符型常量
● 字符串型常量
● 整型常量
● 浮点型常量
● 指数常量
● 标识常量
字符型常量
使用单引号' '包裹的内容都叫字符,单引号只能引一个字符
'a'---->字符常量a
a----->变量a
'!'------>字符!
'1'----->字符1
'\n'----->换行
\ : 转义后面可以跟随字母数字(八进制 十六进制 不写0)符号
转义字符表示一个字符
'\x41'---->'\101'----->'A'
printf("你说:\"sakfkasfh\" ");
'\\'---->字符 \
'\?'---->字符?
字符串常量
使用双引号" "包裹的内容都叫字符串,系统会在字符串最后添加\0作为字符串结束的标志
"hello"----》字符串hello 字符的长度+1
"abc"
整型常量
12345 6
浮点型常量
1.91.32
指数常量
3*10^2----->3e2
2*10^5------>2e5
注意;e的后面不能跟小数 只能是整数
标识常量
宏定义:用于标识常量或者表达式宏替换 宏代替
定义格式:#define宏名(一般大写) 常量或者表达式
int fristname=10;
//大驼峰:FristName
//小驼峰:fristName
#define N 10
特点:只做单纯的替换 不会进行计算
练习:
#define N 2
#define M N+3//2+3
#define NUM N+M/2+1//2+2+3/2+1
void main()
{
int a = NUM;
printf("%d\n",a);
}
答案:6
输入输出语句
1. 按照格式输入输出
格式:
"%d"int
"%c"char
"%f"float
"%lf"double
"%s"字符串
"%#x""%x"十六进制数
"%#o""%o"八进制
"%p"地址
"%e"指数
输出:printf
#include <stdio.h>
int printf(const char *format, ...);
功能:输出内容
参数:
1:字符串 如果包含格式则有后续参数
2:要和第一个参数中的格式对应
。。。。。。。
返回值:输出的字符的个数
输入scanf
int scanf(const char *format, ...);
功能:可以输入一些内容(从终端输入)
参数:
1:字符串(只写格式)
2:用来保存数据的变量的地址
。。。。。。。
返回值:正确输入的个数
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("a=%d b=%d c=%d\n",a,b,c);
int a,b,c;
int ret=scanf("%d%d%d",&a,&b,&c);
printf("ret=%d\n",ret);
[3]变量常量
3.1按字符输入输出
getchar
int getchar(void);
功能:终端输入字符
参数:无
返回值:字符的ASCII码值
putchar
int putchar(int c);
功能:终端输出字符
参数:字符的ASCII码值
返回值:字符的ASCII码值
3.2按格式输入输出
printf
int printf(const char *format, ...);
功能:按格式终端输出
参数:多个
返回值:输出字符个数
格式:
%d int
%c char
%f float
%lf double
%s 字符串
%p 指针
%o 八进制
%x 十六进制 %#x(格式一起输出)
%m.n m位宽 .n保留小数位数
scanf
int scanf(const char *format, ...);
功能:按格式终端输入
参数:多个
返回值:正确输入字符的个数(输出上面输入的内容) 开始位置输入错误,返回0
程序里面有空格,输出结果时也必须有空格
[4]垃圾字符回收
4.1 通过空格回收一个或多个空格
4.2 %*c *抑制符
回收任意一个字符
写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个;(富士安全,广域科技,华辰泰尔,鲁科安全,神戎电子,中安云科,中维世纪,晟安信息,苏州特点电子科技,北京信果科技)
4.3 getchar回收
顺序结构、分支、循环
[5] 分支结构
基本格式:
if(表达式1)
{
语句块1;
}else
{
语句块2;
}
执行顺序:表达式一成立,则执行语句块一,否则执行语句块二
============================
int age=22;
if(age>18)
{
printf("work\n");
}else
{
printf("study\n");
}
多层分支:
if(表达式1)
{
语句块1;
}
else if(表达式2)
{
语句块2;
}
else
{
语句块3;
}
==============
int age=22;
// 0-18 18-30 30-65 65-
if(age>=0&&age<18)
{
printf("weichengnian\n");
}else if(age<=30)
{
printf("qing\n");
}else if(age<=65)
{
printf("zhong\n");
}else
{
printf("lao\n");
}
嵌套结构:
if(表达式1)
{
if(biaodashi 2)
{
语句块1;
}
}
==========================
if(age<0||age>200)
{
printf("error\n");
}else
{
}
注意:
1. if后边可以没有else ,else前边必须有if
2. 分支语句只有一行代码时,可以省略{}
100-90 A
89-80 B
79-70 C
<70 补考
switch
格式:
switch(变量名或表达式)
{
case 常量1:
语句块1;
break;
case 常量2:
语句块2;
break;
default:
语句块3:
break;
}
===============
int a=33;
switch (a/10)
{
case 1:
printf("11111\n");
break;
case 3:
printf("333333\n");
break;
case 5:
printf("55555\n");
break;
default:
printf("error\n");
break;
}
注意:
1. case常量一般是整型或字符
2. case后边可以没有break,程序会从符合条件的分支开始继续向下执行,直到遇见break为止,或执行到分支结束
练习:B
成绩等级划分用switch实现:
[6]循环结构
6.1 for
格式:
for(表达式1;表达式2;表达式3)
{
语句块;
}
表达式1:循环变量赋初值
表达式2:终止条件
表达式3:增值或减值
执行顺序:先执行表达式1,再判断表达式2是否成立
成立:执行语句块;再执行表达式3,判断判断表达式2是否成立。。。
不成立:退出循环
=====================================
int i;
for(i=0;i<5;i++)
{
printf("%d\n",i);//0 1 2 3 4
}
printf("i=%d\n",i);//i=5
变形:
int i=1;
for(;i<5;i++)
{
printf("%d\n",i);
}
============================
int i=1;
for(;i<5;)
{
printf("%d\n",i);
i++;
}
=============================
死循环:
for(int i=1;i>0;i++) for(;;);
for(int i=5;i>0;i-=2)
{
printf("%d\n",i);
}
水仙花数 100-999 153=1*1*1+5*5*5+3*3*3