Bootstrap

C语言基本语句

前言

关于自己的第一篇文章:

记录自己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
  { 
	;
  }                         // 第三个语句块
}

在语句块内声明的变量具有语句块作用域,即变量只能在该语句块内使用

生命周期从语句块开始,直到语句块结尾结束。

同时,在语句块内生成的变量的存储周期也将被限制,若没有staticextern修饰,那么该变量在语句块执行完毕后将被释放。

加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;
}

空语句的作用:

  • 空语句一般用在循环当中,当做空循环体
  • 可用于编译器中设置断点
  • 可以使程序可读性更好,或为以后插入新语句而使用

新人发帖,以上内容可能有误,还请多多指教

;