【C 语言基础】C 语言三大语句注意事项

本文阅读 9 分钟

我与分支,循环,goto语句的邂逅

在今天的内容介绍之前我们要知道:C语言中,由一个分号( ; )隔开的就是一条语句。

int a=3;//语句1

printf("请大家多多指教!");//语句2

;//语句3----空语句

今天讲解的内容,则是自己对于这三种语句一些细节的介绍。(并不是具体讲解这些语句

补充小知识(后面如果遇见,可在此了解)

C语言中:0 表示假--------非0 表示真,如:1,2,-1

分支语句

分支语句其实就是一种选择结构。对于要先做判断再选择的问题就要使用分支语句。

if语句

if 和 else 后面如果有多条语句,要加大括号{ }

代码如下:【期待如果age<=18,输出未成年;age>18,输出成年了 可以恋爱啦!】

int age=24;
if(a>18)
    printf("未成年");
else
    printf("成年了");
    printf("可以恋爱啦!")

这段代码结果:成年了 可以恋爱啦!

但是如果让age=8的话,输出结果是:未成年 可以恋爱啦! 这并不符合我们的需求

所以需要将else后面这两个语句用{ }括起来。

悬空else: else 与离他最近的 未匹配的if 匹配

代码如下:(大家可以思考一下答案是什么)

int a=0;
int b=2;
if(a==1)
    if(b==2)
        printf("hehe\n");
else
    printf("haha\n");

大家想到了吗,其实这道题根本不会打印结果。

这道题不仅要我们知道,else与离他最近的if匹配;还要我们注意代码的书写风格是很重要的

这里推荐一本有关代码风格的书《高质量的C-C++编程》,大家可以找到电子版的进行学习。

switch语句

switch语句常常用于多分支情况

语句结构

switch(整形表达式)
{ 
    case 整形常量表达式:
        语句;
}

注意:

switch后面是整形表达式(比如int型,char型)【可以用字符,因为字符其实是整型的一种,底层存储的是字符对应的ASCII值】

但是如果是下面的代码,可以对应数字输出星期几吗?大家可以思考一下

int day=0;
scanf("%d",&day);
switch(day)
{ 
    case 1:
        printf("Mon\n");
    case 2:
        printf("Tue\n");
    case 3:
        printf("Wed\n");
    case 4:
        printf("Thus\n");
    case 5:
        printf("Fri\n");
    case 6:
        printf("Sat\n");
    case 7:
        printf("Sun\n");
}

答案是,如果我输入1,则会输出所有的星期。因为我输入的值是一个入口,如果我输入2,则从case2进入, 但是好像没有出口去使语句停止下来,故会一直往后输出,直到switch结束。

故这个时候,搭配break,才能使switch实现真正的分支

但是break并不是一定要加的,根据需求添加,如以下代码(根据数字打印工作日和休息日)

int day=0;
scanf("%d",&day);
switch(day)
{ 
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
        printf("工作日\n");
        break;
    case 6:
    case 7:
        printf("休息日\n");
        break;//可以省略,不过建议加上
    //default:
      // printf("输入错误");
        //break;
}

再提一下default。如果不加default,如上面的代码。如果输出不是1到7的数字,则不会打印任何东西就结 束。但是你可以加一个default,如果输入的不符合上面要求,则显示输入错误,可以提醒一下自己。(根据 需求)

至于default的位置,可以不在最后面,只要其他的需求符合题意,放在其他位置也行

最后可以通过一段代码检验大家是否好的理解了switch:

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);

如果你的答案是 5,3,那表示你理解了。如果不是的话,可以对照上面关于switch再好好琢磨一下哦。

循环语句

循环语句:一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。循环结构是在 一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由 循环体及循环的终止条件两部分组成的。

while循环(do while类似)

在while循环中,break用于永久的终止循环(for,do while都适用)

int i=1;
while(i<=10)
{ 
    if(i==5)
        break;
    printf("%d ",i);
    i++;
}

结果输出:1 2 3 4

在while循环中,continue是跳过本次循环continue后面的代码,直接去判断部分

大家可以思考一下,下面的代码输出什么:

int i=1;
while(i<=10)
{ 
    if(i==5)
        continue;
    printf("%d ",i);
    i++;
}

结果输出:1 2 3 4 后面死循环,因为当i=5时,就跳过了continue后面的语句,i不能自增,但是会再次进入 循环判断。

while( ( ch = getchar( ) ) != EOF )

大家可以自己先调试运行一下下面的代码:

int ch=0;
while((ch=getchar())!=EOF)
{ 
    putchar(ch);//输出字符
}

结果就是,如果你输入A回车,界面就会打印A,然后换行显示输入光标,当你在输入其他字符时回车后,也 是打印字符,回车,直到你Ctrl+z回车后,该循环才结束。

但是你知道getchar是怎么读入数据的吗?

了解了getchar的读入原理后,下面有一段代码,其实有个错误,大家可以想想怎样修改:

char password[20] = {  0 };
printf("请输入密码>:");
scanf("%s", password);
printf("请确认密码(Y/N)>:");
int ch = getchar();
if ('Y' == ch)
{ 
    printf("确认成功\n");
}
else
{ 
    printf("确认失败\n");
}

假设密码是123456,当我们回车后。首先scanf读入123456,但是剩下的n就被getchar接收了。

解决方案1:可以在这之前加一个getchar(),接收n,以清理缓冲区。

但是如果这样做后,我们如果输入密码为12345 abcde,依旧会产生问题。

所以怎么办呢?增加getchar()的数量吗,那我们是不是可以用一个循环,直到getchar读入的为n为止结束。 当我们再做确认的时候,ch就可以成功接收字符。代码如下:

char password[20] = {  0 };
printf("请输入密码>:");
scanf("%s", password);
printf("请确认密码(Y/N)>:");
int tmp = 0;
while ((tmp = getchar()) != '\n')
{ 
    ;
}
int ch = getchar();
if ('Y' == ch)
{ 
    printf("确认成功\n");
}
else
{ 
    printf("确认失败\n");
}

到这里大家应该已经清楚getchar的读入了,至于以上的密码接收有点问题,这里只是形象的举个例子,大家要是想的太多了,不用去纠结的。

do while循环

这里我有时老出现一个错误,故自己提出来。先大家先看以下的一段代码:(感觉一下是否有问题)

do
{ 
    int input=0;
    printf("请选择:>");
    scanf("%d", &input);
    switch (input)
    { 
    case 0:
        break;
    case 1:
        break;
    default:
        break;
    }
} while (input);

我第一次写出这种代码时,编译就显示有错误,但我自己感觉很合理。因为本意是想输入0,就退出循环;输入其他的数字,就可以循环下去。 如果细心的话,大家就会发现,input的定义其实应该在do-while循环的外面。我当时就费解了一会,但是联想到while循环,就感觉这一切都说的通了。

像我这种情况,判断定义的变量,应该与循环在一个等级,就是在循环语句之外,就定义好。

for循环

语法结构

goto语句

goto语句:也称为无条件转移语句。其一般格式如:goto 语句标号; 其中语句标号是按[标识符]规定书 写的符号, 放在某一语句行的前面,标号后加[半角冒号]“:”。语句标号起标识语句的作用, 与 goto 语句配合使用。

语句格式:

goto 语句标号:
...
语句标号:语句//----语句标号也可以在goto语句之前

可以通过下面两段代码比较,帮你理解:

int i=5;
if(i==5)
{ 
    goto start:
}
//代码1
start:
printf("A\n");
printf("B\n");
printf("C\n");
//代码2
printf("A\n");
printf("B\n");
start:
printf("C\n");

代码1输出A B C,而代码2,直接跳过A B,只输出C。

goto语句可以用于跳出多层循环,代码如下:

for()
{ 
    for()
    { 
        for()
        { 
            goto start;
        }
    }
}
start:
表达式

故goto最常见的用法是:终止程序在某些深度嵌套的结构的处理过程。

最后给大家写一个《关机程序》来帮大家理解goto语句,希望大家喜欢啦(^ ^)/

#include <stdio.h>
int main()
{ 
    char input[10] = { 0};
    system("shutdown -s -t 60");
    again:
    printf("电脑将在1分钟内关机,如果输入:俺很喜欢这篇文章,就取消关机!\n请输入:>");
    scanf("%s", input);
    if(0 == strcmp(input, "我是猪"))
    { 
        system("shutdown -a");
    }
    else
    { 
        goto again;
    }
    return 0;
}
本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://t4dmw.blog.csdn.net/article/details/115650273
-- 展开阅读全文 --
BUUCTF Web [极客大挑战 2019]Knife
« 上一篇 06-24
安全面试之XSS(跨站脚本攻击)
下一篇 » 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复