02_条件与循环和运算符
运算符优先级表
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
|
() |
圆括号 |
(表达式)/函数名(形参表) |
|
||
. |
成员选择(对象) |
对象.成员名 |
|
||
-> |
成员选择(指针) |
对象指针->成员名 |
|
||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
(类型) |
强制类型转换 |
(数据类型)表达式 |
|
||
++ |
自增运算符 |
++变量名/变量名++ |
单目运算符 |
||
-- |
自减运算符 |
--变量名/变量名-- |
单目运算符 |
||
* |
取值运算符 |
*指针变量 |
单目运算符 |
||
& |
取地址运算符 |
&变量名 |
单目运算符 |
||
! |
逻辑非运算符 |
!表达式 |
单目运算符 |
||
~ |
按位取反运算符 |
~表达式 |
单目运算符 |
||
sizeof |
长度运算符 |
sizeof(表达式) |
|
||
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
双目运算符 |
||
% |
余数(取模) |
整型表达式/整型表达式 |
双目运算符 |
||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
双目运算符 |
||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
双目运算符 |
||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
双目运算符 |
||
< |
小于 |
表达式<表达式 |
双目运算符 |
||
<= |
小于等于 |
表达式<=表达式 |
双目运算符 |
||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
双目运算符 |
||
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
|
/= |
除后赋值 |
变量/=表达式 |
|
||
*= |
乘后赋值 |
变量*=表达式 |
|
||
%= |
取模后赋值 |
变量%=表达式 |
|
||
+= |
加后赋值 |
变量+=表达式 |
|
||
-= |
减后赋值 |
变量-=表达式 |
|
||
<<= |
左移后赋值 |
变量<<=表达式 |
|
||
>>= |
右移后赋值 |
变量>>=表达式 |
|
||
&= |
按位与后赋值 |
变量&=表达式 |
|
||
^= |
按位异或后赋值 |
变量^=表达式 |
|
||
|= |
按位或后赋值 |
变量|=表达式 |
|
||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
从左向右顺序运算 |
基本的if语句
if (条件成立) { 则执行此语句 }; //
if (1) printf("条件成立");
认识算术比较
小于 <
大于 >
等于 ==
关系运算符表达式
5>10 //不成立 0
1>0 //成立 1
3==5 //
5<1 //
运算符表达式用法
int 明=22,玲=23;
printf("明%d岁,玲%d岁,",明,玲);
if (明>玲) printf("明比玲大%d 岁\n",abs(明-玲));
if (明<玲) printf("明比玲小%d 岁\n",abs(明-玲));

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int 明=129,玲=29; printf("明%d岁,玲%d岁,",明,玲); if (明>玲) { printf("明比玲大%d 岁\n",abs(明-玲)); } if (明<玲) { printf("明比玲小%d 岁\n",abs(明-玲)); } if (明==玲) { printf("明与玲一样大\n"); } getchar(); return 0; //返回一个0 }//一段程序结束

明129岁,玲29岁,明比玲大100 岁
scanf格式化输入
scanf; %d来格式化
if..else扩展语句
if (明<=玲)
{
printf("明比玲小%d 岁\n",abs(明-玲));
}
if (明>玲)
{
printf("明与玲一样大\n");
}
//等价于下边代码
if (明<=玲)
{
printf("明比玲小%d 岁\n",abs(明-玲));
}else
{
printf("明与玲一样大\n");
}
在if语句中使用代码块
if (明>玲)
{
printf("明比玲大%d 岁\n",abs(明-玲));
printf("玲比明小一些\n");
}
if语句的嵌套使用
if (明>玲)
{
printf("明比玲大%d 岁\n",abs(明-玲));
if ( 明-玲 >10)
{
printf("明比玲大得多\n");
}
}

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int 明=0,玲=0; printf("请输入明的年龄:"); scanf("%d",&明); printf("请输入玲的年龄:"); scanf("%d",&玲); getchar(); printf("明%d岁,玲%d岁,",明,玲); if (明<玲) { printf("\n明比玲小%d 岁\n",abs(明-玲)); }else if (明>玲) {// printf("\n明比玲大%d 岁\n",abs(明-玲)); if (明-玲>20) { printf("\n明比玲大很多\n"); } }else printf("\n明与玲一样大\n"); getchar(); return 0; //返回一个0 }//一段程序结束

请输入明的年龄:1 2 请输入玲的年龄:明1岁,玲2岁, 明比玲小1 岁
例:某公司招聘职员,年龄要求:18-30;
逻辑与运算符 &&
条件1: 年龄>=18
条件2: 年龄<=30
条件1&&条件2 满足要求
1 && 1=1;
0 && 1=0;
1 && 0=0;
0 && 0=0;
int age;
逻辑或运算符 ||
条件1: 年龄<18
条件2: 年龄>30
条件1 || 条件2 都不满足要求
1 || 1=1
0 || 1=1
1 || 0=1
0 || 0=0
逻辑非运算符 !
! (1223)=0;
! (0)=1;
!(条件1 || 条件2) // 条件1&&条件2
elise if
if (age>=18)
{
if (age<=30)
{
printf("年龄=%d 满足应聘条件YYY\n",age);
}else
{
printf("年龄=%d 不满足应聘条件NNN\n",age);
}
}else
{
printf("年龄=%d 不满足应聘条件NNN\n",age);
}

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int age=0; printf("请输入应聘人的年龄:"); scanf("%d",&age); getchar(); /*if (age>=18&&age<=30) { printf("年龄=%d 满足应聘条件YYY\n",age); }else { printf("年龄=%d 不满足应聘条件NNN\n",age); }*/ /*if (! (age<18||age>30) ) { printf("年龄=%d 满足应聘条件YYY\n",age); }else { printf("年龄=%d 不满足应聘条件NNN\n",age); }*/ /*if (age>=18) { if (age<=30) { printf("年龄=%d 满足应聘条件YYY\n",age); }else { printf("年龄=%d 不满足应聘条件NNN\n",age); } }else { printf("年龄=%d 不满足应聘条件NNN\n",age); }*/ if (age<18) { printf("年龄=%d 不满足应聘条件NNN\n",age); }else if(age>30) { printf("年龄=%d 不满足应聘条件NNN\n",age); }else { printf("年龄=%d 满足应聘条件YYY\n",age); } getchar(); getchar(); return 0; //返回一个0 }//一段程序结束

请输入应聘人的年龄:25 年龄=25 满足应聘条件YYY
认识switch格式
switch(表达式)
{
case 常量表达式:
语句1;
break;
case 常量表达式:
语句2;
break;
case 常量表达式:
语句3;
break;
................
default:
语句n;
break;
}
.........
实例运用:
假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;
这时要求我们设计一段程序来判断:

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int num; printf("请输入彩票号码:"); scanf("%d",&num); //if (num==28) //{ // printf("彩票号码为%d,恭喜,你中了一等奖\n",num); //}else if (num==16) //{ // printf("彩票号码为%d,恭喜,你中了二等奖\n",num); //}else if (num==39) //{ // printf("彩票号码为%d,恭喜,你中了三等奖\n",num); //}else if (num==138) //{ // printf("彩票号码为%d,恭喜,你中了末等奖\n",num); //}else //{ // printf("你彩票的号码未中奖..."); //} switch(num) { case 28: { printf("彩票号码为%d,恭喜,你中了一等奖\n",num); break; } case 16: { printf("彩票号码为%d,恭喜,你中了二等奖\n",num); break; } case 39: { printf("彩票号码为%d,恭喜,你中了三等奖\n",num); break; } case 138: { printf("彩票号码为%d,恭喜,你中了末等奖\n",num); break; } default: printf("你彩票的号码未中奖..."); } getchar(); getchar(); return 0; //返回一个 }//一段程序结束

请输入彩票号码:50 你彩票的号码未中奖...
认识goto格式
goto 标签地址:
一般会配合if语句使用
实例运用:
假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;
这时要求我们设计一段程序来判断:

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int num; printf("请输入彩票号码:"); scanf("%d",&num); if (num==28) { goto Label1; }else if (num==16) { goto Label2; }else if (num==39) { goto Label3; }else if (num==138) { goto Label4; }else { goto Label5; } getchar(); getchar(); return 0; //返回一个 Label1: printf("彩票号码为%d,恭喜,你中了一等奖\n",num); goto end; Label2: printf("彩票号码为%d,恭喜,你中了二等奖\n",num); goto end; Label3: printf("彩票号码为%d,恭喜,你中了三等奖\n",num); goto end; Label4: printf("彩票号码为%d,恭喜,你中了末等奖\n",num); goto end; Label5: printf("你彩票的号码未中奖..."); goto end; end: getchar(); getchar(); return 0; //返回一个 }//一段程序结束

请输入彩票号码:28 彩票号码为28,恭喜,你中了一等奖
认识for循环格式
1、 for (初值表达式;结束条件;循环表达式)
{
语句1;
语句2;
...
语句n;
}
语句b;
....
2、备注
初值表达式:在执行语句1以前仅执行一次;
结束条件: 当条件成立后 语句b;
循环表达式:语句n执行完后就会执行一次循环表达式
实例运用:
假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;
这时要求我们设计一段程序来判断:
修改代码,用for循环优化程序.

#include <stdio.h> #include <math.h> void isyes() { int num; scanf("%d",&num); getchar(); switch(num) { case 28: { printf("彩票号码为%d,恭喜,你中了一等奖\n",num); break; } case 16: { printf("彩票号码为%d,恭喜,你中了二等奖\n",num); break; } case 39: { printf("彩票号码为%d,恭喜,你中了三等奖\n",num); break; } case 138: { printf("彩票号码为%d,恭喜,你中了末等奖\n",num); break; } default: printf("你彩票的号码未中奖...\n"); } } int main(void) //main是程序入口 { int i; printf("请输入彩票号码:"); for (i=0;i<=100;++i) { //验证是否中奖 isyes(); } getchar(); return 0; //返回一个0 }//一段程序结束

请输入彩票号码:20 你彩票的号码未中奖...
修改代码,用goto和swich优化程序.

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int num; int i=0; start: printf("请输入彩票号码:"); scanf("%d",&num); switch(num) { case 28: { printf("彩票号码为%d,恭喜,你中了一等奖\n",num); break; } case 16: { printf("彩票号码为%d,恭喜,你中了二等奖\n",num); break; } case 39: { printf("彩票号码为%d,恭喜,你中了三等奖\n",num); break; } case 138: { printf("彩票号码为%d,恭喜,你中了末等奖\n",num); break; } default: printf("你彩票的号码未中奖...\n"); } getchar(); i++; if (i<1000) goto start; getchar(); return 0; //返回一个0 }//一段程序结束
认识while循环格式
1、 while(循环条件)
{
语句1;
语句2;
...
语句n;
}
语句b;
....
for(;条件;)
二、实例运用:
假设有一期彩票开奖,数字28赢得一等奖,数字 16赢得二等奖,数字39赢得三等奖,数字138赢得末等奖;
这时要求我们设计一段程序来判断:
1、 修改代码,用while循环优化程序.

#include <stdio.h> #include <math.h> void isyes() { int num; scanf("%d",&num); getchar(); switch(num) { case 28: { printf("彩票号码为%d,恭喜,你中了一等奖\n",num); break; } case 16: { printf("彩票号码为%d,恭喜,你中了二等奖\n",num); break; } case 39: { printf("彩票号码为%d,恭喜,你中了三等奖\n",num); break; } case 138: { printf("彩票号码为%d,恭喜,你中了末等奖\n",num); break; } default: printf("你彩票的号码未中奖...\n"); } } int main(void) //main是程序入口 { int i; printf("1--100以内能被3整除的数有:\n"); //for (i=0;i<=100;++i) i=1; while(i<=100) { //验证是否中奖 //isyes(); if (i%3==0) { printf("%2d,",i); } if (i%10==0) { printf("\n"); } ++i;//i=i+1; } getchar(); return 0; //返回一个0 }//一段程序结束

1--100以内能被3整除的数有: 3, 6, 9, 12,15,18, 21,24,27,30, 33,36,39, 42,45,48, 51,54,57,60, 63,66,69, 72,75,78, 81,84,87,90, 93,96,99,
2、 找出1至100内能被3整除的数

//郁金香灬外挂技术 www.yjxsoft.net www.yjxsoft.com QQ150330575 #include <stdio.h> #include <math.h> void isyes() { int num; scanf("%d",&num); getchar(); switch(num) { case 28: { printf("彩票号码为%d,恭喜,你中了一等奖\n",num); break; } case 16: { printf("彩票号码为%d,恭喜,你中了二等奖\n",num); break; } case 39: { printf("彩票号码为%d,恭喜,你中了三等奖\n",num); break; } case 138: { printf("彩票号码为%d,恭喜,你中了末等奖\n",num); break; } default: printf("你彩票的号码未中奖...\n"); } } int main(void) //main是程序入口 { int i; printf("1--100以内能被3整除的数有:\n"); //for (i=0;i<=100;++i) i=1; while(i<=100) { //验证是否中奖 //isyes(); if (i%3==0) { printf("%2d,",i); } if (i%10==0) { printf("\n"); } ++i;//i=i+1; } getchar(); return 0; //返回一个0 }//一段程序结束
三、while和for的区别比较
while(条件表达式)
语句是括号里值为1,一直干下去;括号里值为0,停止循还,程序往后执行
等价于 for(;条件表达式;)
for(循还环处理仅一次;是否满足继续循环条件判断;每一次循环后处理)
{
A;
}
B;
四、作业
1、把课程代码里的while循环改变等价的for循环
2、写一段代码,找出100以内能被5整除的数

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int i=100; while(i){ if(i%5==0) printf("%d\t",i); i--; } getchar(); return 0; //返回一个0 }//一段程序结束

100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25 20 15 10 5
3、写一段代码,找出100以内所有奇数

#include <stdio.h> #include <math.h> int main(void) //main是程序入口 { int i=100; while(i){ if(i%2) printf("%d\t",i); i--; } getchar(); return 0; //返回一个0 }//一段程序结束

99 97 95 93 91 89 87 85 83 81 79 77 75 73 71 69 67 65 63 61 59 57 55 53 51 49 47 45 43 41 39 37 35 33 31 29 27 25 23 21 19 17 15 13 11 9 7 5 3 1
认识 循环嵌套
for (表达式;条件1;表达式)
{
代码段;//可以没有
for (表达式;条件2;表达式)
{
代码段;//可以没有
for (表达式;条件3;表达式)
{
代码段;//可以没有
....
}
}
}
while(条件)
{
代码段;//可以没有
while(条件)
{
代码段;//可以没有
while(条件)
{
代码段;//可以没有
..........
}
}
}
while(条件)
{
代码段;//可以没有
for(表达式;条件;表达式)
{
代码段;//可以没有
while(条件)
{
代码段;//可以没有
..........
}
}
}
二、实例运用:
1、n的阶乘问题(n>0,n为整数)
1*2*3...*n-1*n
1*2*3*4*5=120

#include <stdio.h> #include <math.h> void 阶乘(void) { int num=1; int n=0; int i=1; num=n=i=1; start: scanf("%d",&n); getchar(); if(n<=0) { printf("输入的值不合法,请重新输入\n"); goto start; } printf("%d的阶乘计算公式如下:\n",n); printf("1"); do { num=num*i; if (i>1) { printf("*%d",i);//1*1*2*3 } i=i+1; }while(i<=n); printf("=%d \n",num); // return ; } int main(void) //main是程序入口 { //代码开始 //while for(;1;)//死循环 { 阶乘(); } getchar(); return 0; //返回一个 }//一段程序结束

10 10的阶乘计算公式如下: 1*2*3*4*5*6*7*8*9*10=3628800
2、打印出9*9乘法表如下图格式

#include <stdio.h> int main(void) { int i,j; for (i=1;i<=9;i++) { for(j=1;j<=i;j++) { printf("%d*%d=%2d ",i,j,i*j); } printf("\n"); } getchar(); return 0; }

1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
认识Break Continue关键字
一、 Break作用
直接跳出当前循环层;执行后边的语句;
#include <stdio.h> int main() { int i; for ( i=1;i<=9;i++) { printf("for i=%d \n",i); if (i==3) break; } return 0; }
for i=1 for i=2 for i=3 请按任意键继续. . .
二、Continue关键字
结束本轮循环,继续执行新一轮的循环.

#include <stdio.h> int main() { int i; for ( i=1;i<=9;i++) { printf("for i=%d 1111111111\n",i); if (i>=3) continue; printf("fori=%d 2222222222\n",i); } return 0; }

for i=1 1111111111 fori=1 2222222222 for i=2 1111111111 fori=2 2222222222 for i=3 1111111111 for i=4 1111111111 for i=5 1111111111 for i=6 1111111111 for i=7 1111111111 for i=8 1111111111 for i=9 1111111111 请按任意键继续. . .
三、do while 循环里运用
1、找出9*9乘法表内乘积尾数是6的数限3个。

#include <stdio.h> int main() { int i=1,j=1,n=0; while(j<=9) { i=1; while(i<=9) { if (i>j) break; //(i*j)%10==6 if ((i*j)%10==6) { printf("%d*%d=%2d ",i,j,i*j); n++; if (n>=3) break; } i++; } if (n>=3) break; printf("\n"); j++; } return 0; }

2*3= 6 4*4=16 1*6= 6 请按任意键继续. . .
多层循环的强行终止与goto应用
多层循环的强行中止;
goto语句应用
实例分析
一、实例:
找出一个各位的乘积与各位的和相等的5位数:
12345 i1*i2*i3*i4*i5等于i1+i2+i3+i4+i5
i1*i2*i3*i4*i5==i1+i2+i3+i4+i5
for (i1=1;i1<=9;i1++) //i1*10000
for (i2=1;i2<=9;i2++) //i2*1000
for (i3=1;i3<=9;i3++) //i3*100
for (i4=1;i4<=9;i4++) //i4*10
for (i5=1;i5<=9;i5++) //i5*1
如果 i1*i2*i3*i4*i5==i1+i2+i3+i4+i5 成立
{
打印 i1*10000+i2*1000+i3*100+i4*10+i5*1
跳出整个循环
goto endfor;
}
endfor:

#include <stdio.h> int main(void) { int i1,i2,i3,i4,i5;//分别表示万位,千位,百位,十位,个位 for (i1=1;i1<=9;i1++) //i1*10000 for (i2=1;i2<=9;i2++) //i2*1000 for (i3=1;i3<=9;i3++) //i3*100 for (i4=1;i4<=9;i4++) //i4*10 for (i5=1;i5<=9;i5++) //i5*1 { if( i1*i2*i3*i4*i5==i1+i2+i3+i4+i5 ) { printf("%d \n" ,i1*10000+i2*1000+i3*100+i4*10+i5*1 ); //跳出整个循环 goto endfor; } } endfor: //B getchar(); getchar(); return 0; }
11125