前言
关于自己的第一篇文章:
记录自己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循环的结构:
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 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;
- }
复制代码
空语句的作用:
- 空语句一般用在循环当中,当做空循环体
- 可用于编译器中设置断点
- 可以使程序可读性更好,或为以后插入新语句而使用
新人发帖,以上内容可能有误,还请多多指教