C语言语句基础

语句

一、分支语句

(一)if语句

1. 单分支语句
int main()
{
int a=10,b=20;
if(a>b)
printf("%d",a);

printf("%d,%d",a,b);
}//单分支
2. 双分支语句
int main()
{
int a=10,b=20;
if(a>b)
printf("max=%d",a);
else
printf("max=%d",b);
}//双分支
//printf("%d",a>b?a:b);等价

int main()
{
    int a=10,b=20;
    int max=a;
    if(max<b)
       max=b;
    printf("%d",max);
}//将上面的双分支改为了单分支
3. 多分支语句
int main()
{
   int a=10,b=20;
   if(a==b)
   {
   printf("a==b");
   }
   else if(a>b)
   {
       printf("a>b");
   }
   else
   {
   printf("a<b");
   }
}
4. if语句使用注意事项

(1)当代码中有多个if和多个else时,else与离他最近的if配对。

(2)为了增加代码的可读性,建议条分支下使用{},用代码快分割代码。

(3)如果一个分支下的语句超过1条,就必须使用{}将代码框起来,达到代码块代替该语句。

(4)if语句可以嵌套使用,if中可以嵌套if 语句。if else语句中也可以嵌套else if使用。

下面代码:

int main()
{
int a=1,b=2;
if(a>b)
a=a+b;//此处的分号代表if语句已经结束
b=a;
else //else没有和if配对
a=b;
}
//上述代码编译错误

注意 ( ;)代表语句的结束,上述代码中if语句结束,导致else没有与之配对的if。

(二)switch语句

1. 基本语法
int  n=0
scanf("%d",%n);
switch(n)//n为整型,()中必须是整型变量表达式
{
    case  常量1:语句块1;break//case 后的标签必须是整型 常量或常量表达式
    case  常量2:语句块2;break;
    case  常量3:语句块3;break;
    default:   常量n:语句块n;break;//默认语句
    break;
}//每个常量必须唯一
//break; 跳出switch,否则会一直执行下一条语句。知道遇到break为止
2. 跳转表机制
int main()
{
int x=0;
scanf("%d",&x);
switch (x)
{
	case 0:
	printf("0\n");
	break;
	case 1:
	printf("1\n");
	break;
    case 2:
	printf("2\n");
	break;
	case 3:
	printf("3\n");
	break;
}//case 后的常量是从0开始的,并且顺序编写
 //形成下面这种结构

在这里插入图片描述

跳转表中存放的是每个case语句后的代码的入口地址。

如果case 后的常量不是顺序,而是乱序的话,不会生成跳转表,只能一个case一个case比对去找到需要执行的代码

3. switch嵌套

switch支持嵌套使用。即case 语句后面的语句块中支持使用switch case语句 。

(三)switch之有限状态机

有限状态机( FSM),也叫有限状态自动机,是一种用于描述系统行为模式的数学模型和计算模型。

核心思想是:系统在任意时刻仅处于有限个 “状态” 中的一种,且状态之间可以根据预先定义的 “事件” 或 “条件” 发生转移

举例:我们扫描一个字符串,计算该字符串中有多少个英文单词,通过下标扫描,那么下标对应的值的状态有:扫描开始单词外(空格)单词里(英文字母)结束(‘\0’).

当下标从单词里走到单词外时,证明一个单词已经被扫描过了,相应的计数器加1,当从单词里,走到了空格,即字符串结束了,同时也代表又一个单词被扫描过了,计数器加1.

在这里插入图片描述

#include<stdio.h>
#include<ctype.h>
#include<string.h>
enum status{begin,in,out,end}//枚举,从0开始
 int mian()
{
    char stra[]=" hello new data     is  student class";
    int sum=0;//计数器
    int tag=begin;//当前状态
    int len=strlen(stra)+1;//字符串中总的字符个数,'\0'也算在里面
    int i=0;//下标
    while(i<len)
    {
        switch(tag)
        {
            case begin:
                if(isalapha(stra[i])//是字母
                      tag=in; //状态为in
                   else if(stra[i]=='\0')//是'\0'
                   tag=end;  //状态为end
                   else     //是空格
                   tag=out    //状态为out
                   break;
            case in:
                   if(!isalapha(stra[i])&&stra[i]!='\0')//是空格,从in到out   ,sum++;
                   {
                        sum++;
                       tag=out;
                   }
                   else if(stra[i]=='\0')//是\0,从in 到end,sum++
                   {
                     tag=end;
                       sum++;
                    }
                   break;
           case out:
                       if(isalapha(stra[i]))
                           tag=in;
                        break;
           case end:
                   break;
        }
                   i++;
     }
return 0;
}

二、循环语句

(一)do…while循环

do{} while(表达式);

先执行循环体,后判断。

(二)while循环

while(表达式){}

先判断,后执行循环体。

在这里插入图片描述

当i输入是100时,对于while语句,sum为0.而对于do while语句,sum为100。

(三)for循环

for(表达式1;表达式2;表达式3)

                   **循环语句;**

三个表达式可以省略,但是 ;不能省略。

int main()
{
int sum=0;
for(int i=1;i<=10;i++)
{
   sum+=i;
}
return 0;
}//1到10的累加和

三、跳转语句

(一)break语句

break :语句只能用在switch语句循环语句中,用来跳出switch语句或者提前终止循环,转去执行后续语句。

在这里插入图片描述

(二)continue语句

continue: 只能用在循环中,用来阻止本次循环,当执行到continue语句时,将跳过后续未执行的循环语句,执行判断条件,决定是否进行下一次循环。

continue与break区别:continue结束本次循环,break结束整个循环。

在这里插入图片描述

(三)goto语句

goto: 无条件转移语句

goto语句和标号语句(标识符:)一起使用,它控制程序从goto语句所在的地方转移到标号语句处。goto语句会导致程序结构混乱,可读性降低,而且它所完成的功能完全可以用三种基本结构实现因此一般不提倡使用goto语句。但在某些特定场合下goto语句可能会显出价值,比如在多层循环嵌套中,要从最里面的循环地方跳出所有循环,如果用break语句,不仅要使用多次,而且可读性较差,这时goto语句可以发挥作用。

goto不允许跨函数跳转。

int main()
{
int i=0,j=0,k=0;
for(int i=0;i<10;i++)
{
     for(int j=0;j<10;j++)
        {
           for(int k=0;k<10;k++)
              {
                  if(i+k+j==10)
                        {
                         goto end;
                         }
              }
        }
}
end:
    printf("main end");
return 0;
}

(四)return语句

return 用于结束函数的执行,返回调用者,如果是主函数,则返回至操作系统(终止程序的执行)利用一个return语句可以将一个数据返回给调用者。通常,当函数的返回类型为void时,return语句可以省略,如果使用也仅作为函数或程序结束的标志。

return 与 exit 函数的区别:

  1. 在main 函数中执行return 语句是终止程序的一种方法,另一种方法是调用exit函数,此函数属于<stdlib.h>头文件中。传递给exit函数的实际参数和main 函数的返回值具有相同的含义:两者都说明程序终止时的状态,为了表示正常终止,传递0: exit(0);
    因为 0有点模糊,所以C语言允许用 EXIT SUCCESS来替代(效果是相同):exit(EXIT SUCCESS);传递EXIT FAILURE表示异常终止:Exit(EXIT FAILURE):EXIT SUCCESS和EXIT FAILURE都是定义在<stdlib.h>中的宏,EXIT SUCCESS和EXIT FAILURE的值都分别是 0 和 1.
    作为程序终止的方法,return 语句和exit函数在main 中是等价的,return 表达式:等价于 exit(表达式)

  2. 差异:不管哪个函数调用exit 函数都会导致程序终止, return 语句仅当在main函数中调用才会导致程序终止。

四、空语句

int main()
{
      ;//空语句
}

(一)空语句会破坏if语句的结构

若是双分支或多分支语句,会导致编译错误。如下代码:

int main()
{
    int age=0;
    double sa=5000;
    scanf("%d",&age);
    if(age>=60);//此处的 ;  是个空语句,相当于if成立,执行空语句,进而执行后续语句。if不成立,执行下一条语句
    {
        sa=sa*1.2;
    }
    printf("age=%d:sa=%f\n",age,sa);
    return 0;
}//无论age是否大于60,都会执行sa=sa*1.2;

int main()
{
    int a=0,b=0;
    scanf("%d%d",&a,&b);
    if(a>b);//空语句导致if语句至此结束,下方的else没有与之对应的if,导致编译错误
        printf("a>b\n");
    else
        printf("a<b\n");
}

(二)空语句会破坏循环结构

int main()
{
  int  i=0;
    for(int i=0;i<10;i++);//循环体是空语句
    {
        printf("%d\n",i);//该语句只能执行一次
    }
}

(二)空语句会破坏循环结构

int main()
{
  int  i=0;
    for(int i=0;i<10;i++);//循环体是空语句
    {
        printf("%d\n",i);//该语句只能执行一次
    }
}

以上是C语言语句的相关知识,属于c语言中的基础知识,我们要掌握牢固,以后的编码中需要频繁使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值