前言
关于自己的第一篇文章:
记录自己C语言语句的学习成果,着重控制语句
提示:以下是本篇文章正文内容,下面案例可供参考
C语言基本语句
C语言语句被分为以下五类:
- 1.表达式语句
- 2.函数调用语句
- 3.控制语句
- 4.复合语句
- 5.空语句
3)控制语句用于控制程序的走向
一、表达式语句
表达式语句一般由分号结尾,其形式表示为:表达式;
表达式语句中最常用的是函数调用和赋值,其中变量名本身就是一个表达式,
代码如下(示例):
int a=1,b=2,c;
c=a+b; //赋值语句的左值须是可修改的变量
printf("%d",c);
如果c用const修饰则会报错。
二、函数调用语句
函数调用语句一般由函数名和实参组成,以分号结尾。
代码如下(示例):
int a;
scanf("%d",&a);
printf("%d",a); //输入采用%d格式则输出也为%d
//函数调用
int sum(int x, int y);
int main()
{
int a = 1, b = 2,c;
c=sum(a, b);
printf("%d", c);
return 0;
}
int sum(int x, int y)
{
int z;
z = x + y;
return z;
}
输出:3
注意:若自定义函数在主函数后,则应在开头函数声明,编译器默认返回类型 int
三、控制语句
控制语句用于控制程序的流程走向,已达到自己想要的结果,一般控制语句可以分为:
1.分支语句 如if else ,switch
2.循环语句 如for,while,do while
3.转向语句 如continue,break,goto,return
1)分支语句(选择语句)
日常生活中大多数事情都可以用选择语句完成,如今天中午吃什么,吃米饭或者吃土,早上七点醒来选择继续睡觉或者起床(我自己估计是起不来)
if语句使用方法:
int a=10;
//单分支
if (a==10){
printf("true");
}
else{
printf("false");
}
其中表达式的内容返回的是bool值,即真与假
在C语言中0为假,非0为真。
如果为真,则执行其对应的语句块内容,否则执行else语句块内容,若没有else语句则什么也不输出
上述结果打印true
若有不小于一个if else则使用多分支:
//多分支 判断季节
int month; //定义月份
scanf("%d", &month);
if (month >= 1 && month <= 12) { //判断在1到12之间合法
if (month >= 3 && month <= 5) {
printf("春季");
}
else if(month>=6 && month<=8){
printf("夏季");
}
else if(month>=9 && month<=11){
printf("秋季");
}
else
printf("冬季");
}
else
printf("不合法");
}
输入:12,返回 冬季
再如下边一个例子:
int a=2;
int b=0,c=0;
if(a=1)
{
printf("%d",a);
}
else
{
printf("%d",a);
}
a 返回结果 1
那么为什么会造成这种结果
原因在于误将数学中的 “=” 带入到C语言中,而在这里 “=” 属于赋值运算符,将运算符右边的值赋给左边。
只要结果不为0,都会执行其对应的语句块
int a=2;
int b=0,c=0;
if(a=0) //若为0,则执行else对应的语句块
{
printf("true");
}
else
{
printf("false");
}
结果为 :false
再来一个例子:
int a=2,b=3;
if(a==1)
if(b==3)
printf("true");
else
printf("false")
执行结果 :
结果为空,上面代码的情况容易使人误解
实则else是跟第二个if匹配的,若不加大括号,则默认执行判断后的第一条语句
所以要注意书写风格,养成良好的代码风格十分重要。
switch语句使用方法:
switc语句用于处理多个分支的情况,在判断多种条件下比if else语句要好
例子:
输出周几
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一");
case 2:
printf("周二");
case 3:
printf("周三");
case 4:
printf("周四");
case 5:
printf("周五");
case 6:
printf("周六");
case 7:
printf("周日");
}
return 0;
}
输入6 输出周六周日
为什么会造成这种情况,只想输出周六但是周日也被输出了,当执行判断语句后程序并未跳出switch,而是继续执行switch语句直到完毕
在 C语言中switch语句一般配合break语句使用,以实现单独的执行语句:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("周一");
break;
case 2:
printf("周二");
break;
case 3:
printf("周三");
break;
case 4:
printf("周四");
break;
case 5:
printf("周五");
break;
case 6:
printf("周六");
break;
case 7:
printf("周日");
break;
}
return 0;
}
输入:1
输出:周一
同时switch语句可以将多个case组成一个分支
如:周一到周五打PC游戏,周六周日打手机游戏该怎么做?
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("打PC游戏");
break;
case 6:
case 7:
printf("玩手机游戏");
break;
}
return 0;
}
输入:1~5
输出:打PC游戏
如果删掉一部分break语句,程序会按条件顺序贯穿switch语句,直到遇到break停止
default:一般用来处理错误信息,也常出现在语句尾部
作用为:若条件均不满足,则执行default语句 如:
int main()
{
int num = 0;
scanf("%d", &num);
switch (num)
{
case 1:
case 2:
printf("正确");
break;
default:
printf("错误");
break;
}
return 0;
}
输入:3
输出 :错误
需要注意的是:switch()里的值只能为字符或整形,同时 case后也只能跟字符或整形
switch语句中仅允许出现一个default。
switch中的嵌套:
int main()
{
int a=1,b=2;
switch (a)
{
case 1:
a++; //a变为2
b++; //b变为3
switch (b)
{
case 3:
a++; //a变为3,此时case后边无break,继续贯穿语句
case 4:
b++; //b变为4
break; //跳出
default:
break;
} //无break继续贯穿
case 2:
a++; //a变为4
break;
default:
break;
}
printf("a的值为:%d\nb的值为:%d", a, b);
return 0;
}
输出:
a的值为:4
b的值为:4
总结:break只能跳出当前语句,switch语句很好的改善了分支语句过多的情况
2)循环语句
当想让程序一直重复做某件事时,可以使用循环语句
C语言提供了三种循环:
- for
- while
- do while
for循环的结构:
for(初始化部分;判断循环部分;调整变量部分)
{
循环体;
}
其中for循环三个部分任意部分都可省略,但不建议
for循环流程图:
for循环的使用:
打印1到10的整数
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
输出: 1 2 3 4 5 6 7 8 9 10
那么再来看下面一种情况:
int main()
{
int i= 1;
for ( i = 1; i <= 10; i++)
{
printf("%d ", i);
}
printf("%d", i);
return 0;
}
输出:1 2 3 4 5 6 7 8 9 10 11
注意:即使i最后不满足条件执行循环体,但是i++依然会自增
continue在for循环的使用:
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i==5)
{
continue; //当i=5时,跳过本次循环,不执行后续代码
}
printf("%d ", i);
}
return 0;
}
输出:1 2 3 4 6 7 8 9 10
总结:continue用于终止当前循环,跳过continue后的语句,继续执行下一次循环,调整变量部分仍能执行。
break在for循环中的使用:
int main()
{
for (int i = 1; i <= 10; i++)
{
if (i==5)
{
break;
}
printf("%d ", i);
}
return 0;
}
输出:1 2 3 4
总结:break用于永久跳出当前循环,且不再执行下一次循环
例子:
计算1!+2!..+5!
int main()
{
int num,sum=1;
for (int i = 2; i <=5; i++) //外层循环控制阶乘相加
{
num = 1; //求完一个数的阶乘后初始化为1
for (int j = i; j >1; j--) //内层控制计算每个数的阶乘
{
num *= j;
}
sum += num;
}
printf("%d", sum);
return 0;
}
输出:153
同时还可以将上述方法简化为:
int main()
{
int num=1,sum=0;
for (int i = 1; i <=5; i++)
{
num *= i; //每次i与i-1的阶乘相乘
sum += num;
}
printf("%d ", sum);
return 0;
}
for循环省略条件:
//例一
int main()
{
for(;;) //无条件默认为true
{
printf("hello world!");
}
return 0;
}
//例二
int main()
{
for(int i=1;i<=10;) //省略了调整变量部分 i始终为1
{
printf("hello world!");
}
return 0;
}
//例三
int main()
{
int i = 0;
for (; i<10; i++) //当省略初始化部分,内循环i增到10之后回到外循环,但并没有初始化,所以条件为假跳出循环
{
for (; i < 10; i++)
{
printf("hello world!\n");
}
}
return 0;
}
输出:
例一例二 :死循环打印 hello world!
例三:只打印10次hello world!
结论:不要随意省略for循环的表达式条件,可能会发生不可意料的错误
那么当在循环体内控制变量调整呢?
int main()
{
for(int i=1;i<=10;i++)
{
i++;
printf("hello world!");
}
return 0;
}
输出五次hello world!
结论:不要在循环内部随意更改循环变量的值,防止程序运行错误
while循环的结构:
while(表达式条件)
{
循环体;
}
while循环流程图:
while循环的使用:
打印1到10的数字
int main()
{
int i=1;
while(i<=10)
{
printf("%d",i);
i++;
}
return 0;
}
break在while循环的使用:
int main()
{
int i=1;
while(i<=10)
{
if(i==5)
{
break;
}
printf("%d",i);
i++;
}
return 0;
}
输出:1 2 3 4
这样看来break在while循环中是跟for一样的,那么再来看continue:
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d", i);
i++;
}
return 0;
}
输出:1 2 3 4 之后陷入死循环
结果似乎和for循环的continue输出不一样,这是为什么呢?
原因在while循环中i++的语句放在了continue之后
,导致了当i=5时,continue后的语句不再执行,跳过了循环变量的调整部分,导致i始终是5,造成死循环
do while循环的结构:
do{
循环体;
}
while(条件表达式)
do while循环流程图:
do while循环的使用:
int main()
{
int i= 1;
do
{
printf("%d ", i);
i++;
} while (i<=10);
return 0;
}
输出:1 2 3 4 5 6 7 8 9 10
那么更改循环条件:
int main()
{
int i= 1;
do
{
printf("%d ", i);
i++;
} while (i<1);
return 0;
}
输出:1
结论:do while循环可以保证循环体至少被执行一次
break在do while循环的使用:
int main()
{
int i = 1;
do
{
if (i==5)
{
break;
}
printf("%d ", i);
i++;
} while (i <=10);
return 0;
}
输出:1 2 3 4
continue:
int main()
{
int i = 1;
do
{
if (i==5)
{
continue;
}
printf("%d ", i);
i++;
} while (i <=10);
return 0;
}
输出:1 2 3 4 后死循环
结论:break和continue在do while循环中跟while循环类似
goto语句
在C语言中不建议使用goto语句,但还是要懂得goto语句的用法
goto语句又称为无条件转移语句
,且看下面例子:
int main()
{
int a = 1, b = 2;
if (a<b)
{
printf("a<b\n");
//执行goto语句
goto a;
}
else
{
a:
printf("goto跳转");
}
return 0;
}
输出:
a<b
goto跳转
可以看到goto语句跳转到了本该不执行的else语句里
其中 a: 为标记行
,冒号不可省略
更改条件:
int main()
{
int a = 1, b = 2;
if (a>b)
{
printf("执行goto语句:\n");
goto a;
}
else
{
printf("a>b\n");
a:printf("跳转");
}
return 0;
}
输出:
a>b
跳转
此时 goto语句无意义
goto语句更多应用在多重循环当中
break只能跳出当前循环,而goto可以跳出全部循环
int main()
{
int a = 1, b = 2;
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 10; j++)
{
goto a;
printf("%d", j);
}
}
a: printf("跳出多重循环");
return 0;
}
输出:跳出多重循环
总结:
1.循环中若知道循环次数应尽量使用for循环,反之while循环
2.若想让程序至少被执行一次可以使用do while循环
3.尽量不用goto
四、复合语句
复合语句(compound statement),又称为语句块
它把多条语句用一组大括号包起来,形成单条语句
{
表达式1;
表达式2;
表达式3;
}
语句块跟普通语句的区别是:不用分号结尾
,其实语句块已经在上面代码中多次出现,一般应用在分支语句和循环语句当中
int a=1;
if (a!=0)
{ // 语句块
int i = 0;
while ( status == 0 && i < limit )
{
; //空语句
} // 另一个语句块
}
else
{
;
} // 第三个语句块
}
在语句块内声明的变量具有语句块作用域,即变量只能在该语句块内使用
生命周期从语句块开始,直到语句块结尾结束。
同时,在语句块内生成的变量的存储周期也将被限制,若没有static
、extern
修饰,那么该变量在语句块执行完毕后将被释放。
加static后:
void Static();
int main()
{
printf("第一次调用-----\n");
Static();
printf("第二次调用-----\n");
Static();
return 0;
}
void Static()
{
static int i=10;
printf("%d\n", i);
i++;
printf("%d\n", i);
}
输出:
第一次调用-----
10
11
第二次调用-----
11
12
五、空语句
空语句仅用一个分号表示,代表不执行
int main()
{
for (int i = 0; i <=10; i++)
{
; //空语句
}
return 0;
}
空语句的作用:
- 空语句一般用在循环当中,当做空循环体
- 可用于编译器中设置断点
- 可以使程序可读性更好,或为以后插入新语句而使用
新人发帖,以上内容可能有误,还请多多指教