------- IOS培训、android培训、期待与您交流! ----------
一、 变量的存储
1> 所占用字节数跟类型有关,也跟编译器环境有关
16位编译器 32位编译器 64位编译器
char 1 1 1
int 2 4 4
float 4 4 4 double 8 8 8
2> 变量实例
int b = 10;
int a = 20;
内存由大到小寻址,优先分配内存地址较大的字节给变量。b的内存地址比a大
每个变量都有地址:第一个字节的地址就是变量的地址
3> 查看内存地址:
int a;
printf("a的地址是:%p\n", &a);
4> 注意
在变量未经初始化之前,不要尝试使用变量的值
二、 scanf函数
1.简单用法
int age;
scanf("%d",&age);
scanf函数时会等待用户键盘输入,并不会往后执行代码。scanf的第1个参数是"%d",说明要求用户以10进制的形式输入一个整数。&age的意思是传入age的地址。
输入完毕后,敲一下回车键,目的是告诉scanf函数我们已经输入完毕了,scanf函数会将输入的值赋值给age变量
2.其他用法
1> 用scanf函数接收3个数值,每个数值之间用中划线-隔开
scanf("%d-%d-%d", &a, &b, &c);
3个%d之间是用中划线-隔开的,因此我们在每输入一个整数后都必须加个中划线-,比如这样输入,不然在给变量赋值的时候会出问题
l 注意:数值之间的分隔符是任意的,不一定要用中划线-,可以是逗号、空格、星号*、井号#等等,甚至是英文字母
// 逗号,
scanf("%d,%d,%d", &a, &b, &c); // 输入格式:10,14,20
// 井号#
scanf("%d#%d#%d", &a, &b, &c); // 输入格式:10#14#20
// 字母x
scanf("%dx%dx%d", &a, &b, &c); // 输入格式:10x14x20
2> 用scanf函数接收3个数值,每个数值之间用空格隔开
scanf("%d %d %d", &a, &b, &c);
3个%d之间是用空格隔开的,我们在每输入一个整数后必须输入一个分隔符,分隔符可以是空格、tab、回车
scanf的第一个参数中不要包含\n,比如scanf(“%d\n”, &a); 这将导致scanf函数无法结束
习题
提示用户输入两个整数n,然后计算并输出两个整数的和
/*
提示用户输入两个整数,计算并且输出两个整数的和
*/
#include <stdio.h>
int main()
{
// 1.定义2个变量,保存用户输入的整数
int num1, num2;
// 2.提示用户输入第1个整数
printf("请输入第1个整数:\n");
// 3.接收用户输入的第1个整数
scanf("%d", &num1);
// 4.提示用户输入第2个整数
printf("请输入第2个整数:\n");
// 5.接收用户输入的第2个整数
scanf("%d", &num2);
// 6.计算和,并且输出
int sum = num1 + num2;
printf("%d+%d=%d\n", num1, num2, sum);
return 0;
}
三、 算术运算
1.取余运算 除了加减乘除基本运算之外,还有一项很重要的运算----取余运算:两个整数相除之后的余数,运算符号“%”,%两侧只能是整数,正负性取决于%左侧的值。2. 注意点
1> 自动类型转换
int a = 10.6;
int b = 10.5 + 1.7;
自动将大类型转换为了小类型,会丢失精度
2> 自动类型提升
int b = 10.5 + 10;
将右边的10提升为了double类型
double b = 1.0 / 2;
解决除法的精度问题
3> 强制类型转换
double a = (double)1 / 2;
double b = (double)(1 / 2);
4> 运算顺序
表达式
结合性(结合方向):2+3+4
优先级:5+4*8-3
习题
提示用户输入一个时间的秒数,比如500秒就输入500,然后输出对应的分钟和秒,比如500s就是8分钟20秒
#include <stdio.h>
/*
提示用户输入一个时间的秒数,比如500秒就输入500,然后输出对应的分钟和秒,比如500s就是8分钟20秒
*/
int main()
{
/*
// 将c的值固定在10以内
int a = 96546546;
int c = a % 10;
*/
// 1.提示用户输入时间
printf("请输入一个时间值(秒):\n");
// 2.接收用户输入的时间
int time;
scanf("%d", &time);
// 3.转换成对应的分钟和秒
int minute = time / 60; // 分钟
int second = time % 60; // 秒
printf("%d秒 = %d分钟%d秒\n", time, minute, second);
return 0;
}
}
四、 自增自减
1. 简单使用
++ 自增运算符。如a++,++a,都等价于a = a+1
自减运算符。如a--,--a,都等价于a = a-1
5++是错误的
1. ++a和a++的区别
++a先自加后运算,a++先运算后自加。
五、 sizeof
1. 作用
用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
2. 基本形式
sizeof( 变量\常量 )
sizeof 变量\常量
sizeof( 数据类型 )
不能是sizeof 数据类型
六、 关系运算(比较运算)
1. 条件判断
默认情况下,我们在程序中写的每一句正确代码都会被执行。但很多时候,我们想在某个条件成立的情况下才执行某一段代码
2. 真假
>在C语言中,条件成立称为“真”,条件不成立称为“假”,因此,判断条件是否成立,就是判断条件的“真假”。
>怎么判断真假呢?C语言规定,任何数值都有真假性,任何非0值都为“真”,只有0才为“假”。也就是说,108、-18、4.5、-10.5等都是“真”,0则是“假”。
3. 关系比较
开发中经常要比较,比如斗地主游戏中牌的大小。利用关系运算符就可以比较两个值的大小。
关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。
4. 使用注意
关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
关系运算符的结合方向为“从左往右”
关系运算符的优先级小于算术运算符
七、 逻辑运算
>有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码。这种情况下,我们就要借助于C语言提供的逻辑运算符。
>逻辑运算的结果只有2个:“真”为1,“假”为0
1> 使用格式
“条件A && 条件B”
2> 运算结果
只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”
3> 运算过程
总是先判断条件A是否成立
如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”
若想判断a的值是否在(3, 5)范围内,千万不能写成3<a<5,因为关系运算符的结合方向为“从左往右”。 比如a为2,它会先算3<a,也就是3<2,条件不成立,结果为0。再与5比较,即0<5,条件成立,结果为1。因此 3<a<5的结果为1,条件成立,也就是说当a的值为2时,a的值是在(3, 5)范围内的。这明显是不对的。正确的判断方法是:(a>3) && (a<5)
2.|| 逻辑或
1> 使用格式
“条件A || 条件B”
2> 运算结果
当条件A或条件B只要有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。
3> 运算过程
总是先判断条件A是否成立
如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”
如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A || 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。比如 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”
! 逻辑非
1> 使用格式
“! 条件A”
2> 运算结果
其实就是对条件A进行取反:若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是说:真的变假,假的变真。
可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”
优先级
逻辑运算符的优先级顺序为: 小括号() > 负号 - > ! > 算术运算符 > 关系运算符 > && > ||
表达式!(3>5) || (2<4) && (6<1) :先计算 !(3>5)、(2<4)、(6<1),结果为1,式子变为1 || 1 && 0,再计算1 && 0,式子变为1 || 0,最后的结果为1
表达式3+2<5||6>3 等价于 ((3+2) < 5) || (6>3),结果为1
表达式4>3 && !-5>2 等价于 (4>3) && ((!(-5)) > 2) ,结果为0
八、三目运算符
N目运算符->三目运算符
int a = 5?10:2;
获得a、b中的最大数
获得a、b、c中的最大数
九、 流程控制
l 顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
2 选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
3 循环结构:在给定条件成立的情况下,反复执行某一段代码。
1.选择结构-if
if (表达式) 语句1;
if(count>50) 开班; 上课;
if(表达式) 语句1; else 语句2;
f(count>50) 开班; else 不开班;
if(表达式) { }
if(count>50) {开班; 布置课室;} else {}
if -else if-else
if(a==0) else if (a>0) else
特点:只有一个括号会被执行
复合条件
上课时间的取值范围(9~12 || 14 ~17)
2.选择结构-switch
1. 简单使用
switch (表达式) {case 数值 1: break;case 数值 2;....defult:break}
2.举例
int a = 10;
switch (a)
{case 0:
printf("这是一个0");
break;
case 5:
printf("这是一个5");
break;
case 10:
printf("这是一个10");
break;
defult:
printf("什么也不是");
break;
}
不要忘记break!!!
3. if和switch的对比
很多情况可以互换
if用得比较多,比较灵活,switch只能某个单值
习题:
对于同一道题if 和switch的比较
输入一个整数score代表分数,根据分数输出等级(A-E)(用两种方式)
A:90~100 score/10 == 9、10
B:80~89 score/10 == 8
C:70~79 score/10 == 7
D:60~69 score/10 == 6
E:0~60
if
#include <stdio.h>
int main()
{
// 1.提示输入
printf("请输入分数值:\n");
// 2.接收输入
int score;
scanf("%d", &score);
// 3.判断等级 (性能最高)
if (score>=90 && score<=100) { // [90, 100]
printf("A\n");
} else if (score>=80) { // [80, 89]
printf("B\n");
} else if (score>=70) { // [70, 79]
printf("C\n");
} else if (score>=60) { // [60, 69]
printf("D\n");
} else { // (-∞, 59]
printf("E\n");
}
/* 性能中等
if (score>=90 && score<=100) { // [90, 100]
printf("A\n");
} else if (score>=80 && score<=89) { // [80, 89]
printf("B\n");
} else if (score>=70 && score<=79) { // [70, 79]
printf("C\n");
} else if (score>=60 && score<=69) { // [60, 69]
printf("D\n");
} else { // (-∞, 59]
printf("E\n");
}*/
/* 性能最差
if (score>=90 && score<=100) { // [90, 100]
printf("A\n");
}
if (score>=80 && score<=89) { // [80, 89]
printf("B\n");
}
if (score>=70 && score<=79) { // [70, 79]
printf("C\n");
}
if (score>=60 && score<=69) { // [60, 69]
printf("D\n");
}
if (score<=59) { // (-∞, 59]
printf("E\n");
}*/
return 0;
}
switch:
#include <stdio.h>
int main()
{
int score = 100;
switch (score/10) {
case 10: // 100
case 9: // 90+
printf("A\n");
break;
case 8: // 80+
printf("B\n");
break;
case 7: // 70+
printf("C\n");
break;
case 6: // 60+
printf("D\n");
break;
default:
printf("E\n");
break;
}
/*
if和switch
1> if语句能完成的功能,switch并不一定能完成
int a = 10;
if (a>100)
{
}
2> 在有些情况下,if语句和switch语句可以互换
3> switch能完成的功能,if语句都能完成
*/
return 0;
}
十、 循环结构-while
1. 简单使用
连续printf(“俯卧撑”)20次;
while(表达式) { }
continue:输出5次休息一下
break的使用:某次的时候停止循环
2. 特点
只有条件成立才会执行循环体
3. 习题
提示用户输入一个正整数n,计算1+2+3+…+n的和
#include <stdio.h>
int main()
{
// 1.提示输入
printf("请输入一个正整数:\n");
// 2.接收输入
// 定义变量保存用户输入的整数
int n;
scanf("%d", &n);
if (n<=0)
{
printf("非法输入\n");
return 0;
}
// 3.计算
// (1 + n) * n / 2;
// 定义变量保存和
int sum = 0;
int number = 0; // 默认被加的数值
while (number < n)
{
number++;
sum += number; // 累加
}
printf("%d\n", sum);
return 0;
}十一、 循环结构-do while
1.特点
一定会执行一次循环体
2.while和do while循环对比
int i=0;
while(i<0){
i++;
}
int i=0;
do{
i++;
} while(i<0);
while先判断,do while先循环一次再判断
5. while循环和for循环的比较
可以互换
for循环的变量可以及时回收
习题
输出九九乘法表
int main()
{
int i = 1;
while(i<10)
{
int j = 1;
while(j<=i)
{
printf("%dx%d=%d\t",i,j,i*j);
j++
}
printf("\n");
i++
}
}
十二、 break和continue
1. break
l 使用场合:switch\循环结构
2 循环嵌套下的break
2. ontinue
l 使用场合:循环结构
l 循环嵌套下的continue
今天学习了scanf函数,基本运算和流程控制,以前总是搞不清楚循环的区别,如今弄得很清楚,如果你也感兴趣,就来黑马IOS论坛http://bbs.itheima.com/forum-184-1.html大家一起讨论吧