C语言整理:3.1 语句

        个人理解,C语言的语句应该是描述处理逻辑的最小单位。比如将两数相加,进行一个判断,做出一个跳转。(这里只是整理时的说法,真正的语句大家可以到编译原理里面去寻找答案,一般语句是语法分析的最小单位。)

        (一)基础语句

        一些简单的记号合法组合而成,一般以“;”结束,比如下面这些都可以算作是语句。当一些列语句结合在一起时,就是语句块。C语言可以使用“{}”记号将语句块包起来,在函数、if_else、switch、for、while等处理里一般都会见到,有的是必须加"{}的。一般来讲,局部变量的作用域(生命周期)就在当前语句块,而全局变量则是所有语句块都能使用。

int a;                             //定义一个变量a
a = b + c;                         //将b和c相加并赋值给a
#define a 10                       //定义一个宏,编译时替换为10
goto label;                        //跳转到label定义的位置
return;                            //跳出当前函数处理

        (二)条件语句

        条件语句用于只有某些条件满足时才能执行的代码。比如,团队聚餐时,结账的总是管理团队经费的人,并不是所有人都需要结账。C语言的条件判断一般用if来表示或者if_else来表示,支持嵌套。

        可以看如下代码,如果管钱,则先付帐再离开,如果不是,可以直接离开。

if(TRUE == IsMoneyManager)//如果是管钱的,需要先付钱。
{
    PayForMeal();
}

LeaveTheRestaurant();//离开餐厅

        但是如果不是管钱的,聚完餐其实一般不会直接离开,而是等管理团队经费的人把钱给了然后一起离开,用代码表述如下。

if(TRUE == IsMoneyManager)//如果是管钱的,需要先付钱。
{
    PayForMeal();
}
else//如果不是,那就先等一会儿
{
    Wait();
}

LeaveTheRestaurant();//大家一起离开餐厅

        当然,C语言的if else组合可以很复杂,以满足我们实现判断逻辑的需求,如下图所示。

if(a0)
{
    DoIt();
    if(a0b0)
    {
        if(a0b0c0)
        {
            ...
        }
    }
    else if(a0b1)
    {
    }
    else if(a0b2)
    {
    }
    ...
    else
    {
    }
}
else if(a1)
{
    ...
}
...
else
{
}

        但其实这样看着,会有很多的if else,如果我们给定一个分数(0-100),判定这个成绩所属等级(90-100,A;80-89,B;70-79,C;60-69,D;0-59,E。)这样的话,用if else会显得很烦琐,这里需要用到另一种条件分支语句switch,直接上例子说明。

int score = GetScore();
int score_level = score / 10;
char level = '-';

switch(score_level)
{
    case 0:
    case 1:
    case 2:
    case 3:
    case 4:
    case 5:
    {
        level = 'E';
        break;
    }
    case 6:
    {
        level = 'D';
        break;
    }
    case 7: 
    {
        level = 'C';
        break;
    }
    case 8:
    {
        level = 'B';
        break;
    }
    case 9:
    case 10:
    {
        level = 'A';
        break;
    }
    default:
    {
        level = 'X';
        break;
    }

}

        可以看到switch语句逻辑清晰了很多。switch语句前面的括号里的score_level必须是一个整型数据。每一个case表示一个可能的情况,如果不使用break终止,那么前一个case执行完成后会执行后一个能匹配上的case里的语句。如果case都匹配不上且定义了default分支,那么执行default里的处理;如果没有定义default分支,那么直接终止switch相关处理。

        (三)循环语句

        循环语句的意思是,在一定条件成立时,重复执行一个语句块。C语言里的循环语句有for循环、while循环和do_while循环,同时if和goto语句相结合也能达到循环的效果。

        先给出一个for循环的示例,计算1-100的算术和。

int sum = 0;
for(int i = 1; i <= 100; i++)
{
    sum += i;
}

        其中()中的以";"分隔的三个部分,有不同的逻辑控制意义。

        “int i = 0;”表示循环初始化,这里将i的初始值设定成了1。

        "i <= 100"表示循环执行条件,如果这条语句为真,则循环体将被执行,如果为假,则循环终止。

        "i++"表示循环增量,其实是每次循环体执行完毕后,将执行该语句,这里是指每次将i的当前值加给sum变量后,将i的值加一。

        而已"{}"包含起来的语句块,就是这个for循环的循环体,也就是每次被重复执行的主体部分。

        for循环的要素比较多,“()”中就三个语句。相较下while语句要简单一些,同样计算1-100的算术和,while循环实现如下。

int sum = 0;
int i = 1;

while(i <= 100)
{
    sum += i;
    i++;
}

        "()"中就是while循环的判断条件,只要条件为真,"{}"中的循环体就会被执行。

        而do_while循环则和while循环有些微的差别,会至少执行一次循环体"{}"。计算1-100的算术和,do_while实现如下。

int sum = 0;
int i = 1;

do
{
    sum += i;
    i++;
}while(i <= 100);

        循环语句是可以嵌套的,for、while和do_while可以相互嵌套,也可以自身嵌套,从而构成多重循环。比如需要计算1-100,101-200和201-300的算术和。

int arr_sum[3];

for(int i = 0; i < 3; i++)
{
    start = i * 100 + 1;
    end = (i + 1) * 100;
    arr_sum[i] = 0;
    for(int j = start; j <= end; j++)
    {
        arr_sum[i] += j;
    }
}

        (四)跳转语句

        跳转语句用于在C语言运行过程中,改变语句的执行顺序。有return、break、continue、goto四种。

     return语句用于终止当前执行的函数,并返回调用这个函数的地方。return可以携带返回值,对应void类型函数,使用“return;”,对于有返回值的函数,使用“return result;”。这里result是要返回的值。

        break语句用于终止switch_case、for、while和do_while语句的执行,即中途跳出当前层的前述四种语句。

        continue语句用于跳过当前循环,被跳过的部分是从continue开始往后的循环体。

        goto语句则是直接跳转到某个预定义好的标签,因为goto会破坏程序的结构化设计,所以现在很少使用。

        这四种语句给出示例如下。

/*    return语句     */
void nothing_to_do_function(int param)
{
    if(1 == param)
    {
        return;//用于退出当前函数
    }

    param++;//不退出会执行这条语句
}

/*    break语句     */
int sum = 0;
for(int i = 1; i < 100; i++)
{
    if(sum > 1000)
    {
        break;//终止当前for循环,只计算到小于1000的最大和
    }
    sum += i;
}

/*    continue语句     */
int sum = 0;
for(int i = 1; i < 100; i++)
{
    if(0 == (i % 5))
    {
        continue;//求和里不包含所有能被5整除的数
    }
    sum += i;
}

/*    goto语句     */
int i = 1;
int sum = 0;
start_label:
sum += i;
i++;
if(i <= 100)
{
    goto start_label;//如果i没有超过100,那么从start_label再执行
}


猜你喜欢

转载自blog.csdn.net/lanruotian/article/details/81196920