目录
C语句
C语句分成五大类:
(1)控制语句
用于完成一定的控制功能。C语言只有9种控制语句:
(一)条件判断语句也叫分支语句
① if()…else… (条件语句)
if(x>y) max=x;
else max=y;
x>y是判别条件,“ max=x;max=y; ” 是C语句,这两个语句是内嵌在 if…else语句中的。作用是:先判别“ x>y ”是否成立,成立执行语句“max=x;” ,否则就执行语句“max=y;”。
注意:if 语句内含有多条语句时,应用花括号括起来(else同理):
if(x>y)
{
max=x;
printf("%d\n",max);
}
else
{
max=y;
printf("%d\n",max);
}
② switch (多分支选择语句)
(二)循环执行语句
③ while()… (循环语句)
④ do…while() (循环语句)
⑤ for()… (循环语句)
(三)转向语句
⑥ continue (结束本次循环语句)
⑦ break (中止执行switch或循环语句)
⑧ return (从函数返回语句)
⑨ goto (转向语句,在结构化程序中基本不用goto语句)
(2)函数调用语句
函数调用语句由一个函数调用加一个分号构成,例如:
printf(“Hello World!\n”);
其中printf(“Hello World!\n”);是一个函数调用,外加一个分号构成的一条语句。
(3)表达式语句
表达式语句由一个表达式加一个分号构成,最典型的是由一个赋值表达式构成一个赋值语句。
例:x=3 是一个赋值表达式,而
x=3; 是一条赋值语句。
一个表达式的最后加上一个分号就变成了一条语句。
(4)空语句
一般形式:
;
即只有一个分号。
(5)复合语句
用 {} 括起来的所有语句,叫做复合语句。
if(x>y)
{
max=x;
printf("%d\n",max);
}
复合语句中可包含声明部分。
三大结构
顺序结构
顺序结构是程序设计语言最基本的结构,其包含的语句按照书写的顺序执行,且每条语句都将被执行。其他的结构可以包含顺序结构,也可以作为顺序结构的组成部分。
上题目,让我们来感受一下顺序结构。
【例1. 0】输入圆的半径,求圆的周长和面积。
#include<stdio.h>
#define PI 3.14159
int main()
{
float r,C,S;
printf("请输入圆的半径:");//提示作用
scanf("%f",&r);//输入圆的半径
C = 2 * PI * r;//计算周长
S = PI * r * r;//计算面积
printf("C = %.4f\n",C);//输出,并保留四位小数
printf("S = %.4f\n",S);//输出,并保留四位小数
return 0;
}
运行结果:
请输入圆的半径:4
C = 25.1327
S = 50.2654
【例1. 2】输入三个字符,将它们反向输出。
#include<stdio.h>
int main()
{
char ch1,ch2,ch3;
printf("请输入三个字符:");//提示作用
ch1 = getchar();
ch2 = getchar();
ch3 = getchar();//依次输入三个字符
putchar(ch3);
putchar(ch2);
putchar(ch1);//反向输出三个字符
return 0;
}
运行结果:
请输入三个字符:ABC
CBA
注:输入三个字符时,要连续输入,不要插入空格。
【例1. 3】输入任意三个整数,求它们的和与平均值。
#include<stdio.h>
int main()
{
//声明变量,并初始化为 0
int a = 0,b = 0,c = 0,sum = 0;
float average=0;
printf("请输入三个整数:");
scanf("%d%d%d",&a,&b,&c);//输入三个整数,可用空格或回车分开
sum = a + b + c; //求和
average = sum / 3.0;//求平均值
printf("sum = %d,average = %f\n",sum,average);//输出和与平均值,且平均值保留两位小数。
return 0;
}
运行结果:
请输入三个整数:10 20 30
sum = 60,average = 20.00
思考:
average = sum / 3.0 是否可以写成 average = sum / 3 ?
答案是:不可以。
因为a, b, c 均为整数,且3也是整数,求商出来的结果也是整数。
另外一种方法就是强制转换:
average = (float)sum / 3;
把整型sum强制转换为浮点型。
选择结构
分支语句,即有多个选择方向。
C语言有两种选择语句:
(1)if语句
if语句,用来实现两个分支的选择结构。
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
//多分支
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
看代码:
#include<stdio.h>
int main()
{
if(3==5)
printf("hehe\n");
return 0;
}
运行结果:
运行的结果为空,为什么呢?
让我们思考一下。
因为if语句的表达式(3==5)为假,就不输出。
如果表达式改为3==3,那结果输出hehe。
表达式只要为真,就输出打印。
我们再来看看,下面的这段代码的运行结果是多少呢?
(嵌套的 if 语句)
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
运行结果:
注意:else是和最近的且未匹配的 if 相匹配。
所以这段代码其实应该是这样:
#include<stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
输出结果为空,原因依然是表达式(a==1)为假,后面的代码没有执行。
所以,写代码时要规范,既方便别人阅读,也方便自己。
条件运算符
条件运算符的一般形式为:
表达式1 ?表达式2 :表达式3
条件运算符 ?:的功能是:在计算表达式1后,如果值为真(非0),则计算表达式2,并将表达式2的值作为整个表达式的结果;如果表达式1的值为假(0),则计算表达式3,并将表达式3的结果作为整个表达式的值。
例:
x=10;
if(x > 8)
y=20;
else
y=10;
那我们可以用条件表达式来处理:
y = (x > 8) ? 20 : 10;
因x=10,比8大。故y的值为20,如果x所赋的值小于等于8,y的值赋为10
(2)switch语句
用来实现多分支的选择结构。
switch语句的一般形式为:
switch(整型表达式)
{
case 常量1 : 语句1;
case 常量2 : 语句2;
case 常量3 : 语句3;
case 常量4 : 语句4;
…
case 常量n : 语句n;
default :语句n+1;
}
【例2 - 2 .1】输出一个整数day,取值范围为1~7,输出对应的英文翻译。
#include<stdio.h>
int main()
{
int day = 0;//声明变量,并初始化为0
scanf("%d", &day);
switch (day)
{
case 1:printf("Monday!\n");
case 2:printf("Tuesday!\n");
case 3:printf("Wednesday!\n");
case 4:printf("Thursday!\n");
case 5:printf("Friday!\n");
case 6:printf("Saturday!\n");
case 7:printf("Sunday!\n");
default:printf("输入错误!\n");//其他输出
}
return 0;
}
运行结果:
3
Wednesday!
Thursday!
Friday!
Saturday!
Sunday!
输入错误!
这是为什么呢?我们的目标是只输出该天的英文翻译,为何后面几天的结果均被输出呢?
case标签起的是语句标号的作用,程序并不在此进行判断。当程序跳转至某个标签行,就会按顺序执行标签以后的所有语句。
故,当我们输入3时,跳转到case 5相匹配,程序跳转至该行,执行此后所有语句。
而为了不输出其后续的case语句,就要在每个case语句后面加上break语句,以执行完语句后跳出流程。
#include<stdio.h>
int main()
{
int day = 0;//声明变量,并初始化为0
scanf("%d", &day);
switch (day)
{
case 1:printf("Monday!\n");break;
case 2:printf("Tuesday!\n");break;
case 3:printf("Wednesday!\n");break;
case 4:printf("Thursday!\n");break;
case 5:printf("Friday!\n");break;
case 6:printf("Saturday!\n");break;
case 7:printf("Sunday!\n");break;
default:printf("输入错误!\n");break;//其他输出
}
return 0;
}
运行结果:
3
Wednesday!
我们来看看下面这段代码,你们觉得结果是什么?
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
//switch允许嵌套使用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("m = %d, n = %d\n", m, n);
return 0;
}
运行结果:
m = 5, n = 3
循环结构
while循环
一般形式:
while(表达式)
语句
我们已经掌握了,if语句:
if(表达式)
语句
当条件满足的情况下,if语句后的语句执行,否则不执行。
但是这个语句只会执行一次。
那我们应该怎么做才能将一件事,同时做很多遍呢?
我们只需将 if 改为 while即可
该程序陷入了一个死循环。
【例3. 1】 在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d ", i);
i = i+1;// i++;
}
return 0;
}
运行结果:
上面的代码已经帮我们了解了 while 语句的基本语法,那我们再来了解一下:
while语句中的break和continue
(1)break
这里代码输出的结果是什么?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
运行结果:
1 2 3 4
通过以上代码我们可知break在while循环中的作用:
其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。
所以:while中的break是用于永久终止循环的。
(2)continue
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i + 1;//i++;
}
return 0;
}
这里代码输出的结果又是什么呢?
1 2 3 4
1 2 3 4 5
1 2 3 4 5 6 7 8 9 10
1 2 3 4 6 7 8 9 10
运行结果:
1 2 3 4
通过以上代码我们可知continue在while循环中的作用就是:
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口判断。
如果我们将i++;的位置放到选择语句的前面,那结果又变成了这样:
do while循环
一般形式:
do
循环语句;
while(表达式);
注意:do while 循环以分号结尾。
do while语句的流程图为:
先执行循环体,然后再检查条件是否成立,若成立,再执行循环体,直到条件不成立。
循环至少执行一次。
【例3. 2】 在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
运行结果:
10
do while语句中的break和continue,意义与while一样。
for循环
for循环的一般形式为:
for(表达式1; 表达式2; 表达式3)
表达式1
表达式1为初始化部分,用于初始化循环变量的。
表达式2
表达式2为条件判断部分,用于判断循环时候终止。
表达式3
表达式3为调整部分,用于循环条件的调整。
【例3. 3】 在屏幕上打印1-10的数字。
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
for ( i=1(初始化); i<=10(判断部分); i++(调整部分) )
运行结果:
1 2 3 4 5 6 7 8 9 10
让我们来对比一下while循环和for循环。
int i = 0;
i = 1;
//while循环
while(i<=10)
{
printf("%d ", i);
i = i+1;// i++;
}
//for循环
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
while循环中依然存在循环的三个条件,但是却分布较为分散,而 for循环就将这个问题解决了,条件集中,方便查找和修改。
所以,for循环的风格更胜一筹;for循环使用的频率也最高。
break和continue
for循环中的break和continue,意义与while一样。
但也有些许差别,你们自行体会体会。
// break
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
break;
printf("%d ",i);
}
return 0;
}
//continue
#include <stdio.h>
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;
printf("%d ",i);
}
return 0;
}
for语句的循环控制变量
建议:
1.不可在for 循环体内修改循环变量,防止 for 循环失去控制。
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
//前闭后开
for(i = 0; i < 10; i++)
//两边都是闭区间
for(i = 0; i <= 9; i++)
一些for循环的变种
1.条件为空
for(;;)
{
printf("hehe\n");
}
2.for循环的嵌套使用
for(; i<10; i++)
{
for(; j<10; j++)
{
printf("hehe\n");
}
}
3.多变量控制
for (x = 0, y = 0; x<2 && y<5; ++x, y++)
{
printf("hehe\n");
}
问题来了!!!
下面代码循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i =0,k=0; k=0; i++,k++)
k++;
return 0;
}
1次?
0次?
还是不输出?
还是陷入了死循环?
正确答案是0次,因为条件表达式 k = 0,是赋值表达式,k=0 时,条件表达式为假,该循环不执行。