前言

作为在宿舍上网课的第3周,这节课照样因为停课而没有上。现在的天气一直很不好,两个台风接踵而至,本土疫情又有复发,上网课已经成了常态,希望之后会好吧。看了下老师留在moodle上的课堂记录,这节课讲的是while循环和左右值的区别,以及typedef关键字。

本合集可以在主页的日常-C语言学习中找到,也可以直接访问:https://hoyue.fun/daily/c/

 

循环

while循环基本语句

总所周知,while的意思是当......的意思,while循环也就是当条件成立时所执行的循环语句。

while循环语法:

while (condition_expression)
{
    statement
}

 只要给定的条件为,C 语言中的 while 循环语句会重复执行一个目标语句。

  • statement 可以是一个单独的语句,也可以是几个语句组成的代码块。
  • condition 可以是任意的表达式,当为任意非零值时都为 true。当条件为 true 时执行循环。 当条件为 false 时,退出循环,程序流将继续执行紧接着循环的下一条语句。
  • 若不加{},则默认执行while下的第一行语句,之后的都不会执行

我们注意到while循环和for循环的区别就是没有一个标记变量记录次数,意思说for是在知晓循环次数时用比较好,而while循环在不知道循环次数只知道循环终止点时用比较好。for循环好像没学过,在等下会说。

例如:

int a=0;
while( a < 20 )//当a<20时执行下方语句
{
    printf("a 的值: %d\n", a);
    a++;//和a=a+1;一样
}
while( a < 20 )//当a<20时执行下方语句,但是正常情况上方语句执行完后a=20,该句语句不成立,就不会执行下方语句
{
    printf("错误");
}

 显然的是输出结果就是0到19,而不会输出错误。


for循环基本语句

for 循环允许您编写一个执行指定次数的循环控制结构。for循环必须知道终止点

for循环基本语法:

for(init;condition;increment)
{
    statements;
}
  1. init 会首先被执行,且只会执行一次。这一步允许你声明并初始化任何循环控制变量。你也可以不在这里写任何语句,只要有一个分号出现即可。一般为设置循环控制变量,可以简单看为这是起始点
  2. 接下来,会判断 condition。如果为真,则执行循环主体。如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。可以简单看为这是终止点。
  3. 执行完 for 循环主体后,控制流会跳回上面的 increment 语句。该语句允许您更新循环控制变量。该语句可以留空,只要在条件后有一个分号出现即可。这里语句一般使循环控制变量变化
  4. 条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。在条件变为假时,for 循环终止。

例如:

/* for 循环执行 */
int a;
for(a = 10;a < 20; a = a + 1 )//表示先让a=10,然后判断a<20是否成立,若成立则执行下方输出语句,并在输出结束后直接a=a+1,让a的值变化
{
    printf("a 的值:%d\n", a);
}

 输出则为10到19.

注意:当在C99标准之前的编译器中,可能不允许在for的第一段里定义变量,需要在外面定义,如上方例子。在之后的标准可以在for的第一段定义循环控制变量,而且只在当前循环内有效。

例如:

for(int i=1;i<=10;i++)

 就是在for循环中定义,而这个i只在这个循环内有效,在循环之后的语句中再定义i不会出问题。


do...while 循环

不像 for 和 while 循环,它们是在循环头部测试循环条件。在 C 语言中,do...while 循环是在循环的尾部检查它的条件。do...while 循环与 while 循环类似,但是 do...while 循环会确保至少执行一次循环。

简单来说就是先执行后判断

C 语言中 do...while 循环的语法:

do
{
    statements;
}while(condition);

 

  • 条件表达式出现在循环的尾部,所以循环中的 statement(s) 会在条件被测试之前至少执行一次
  • 如果条件为真,控制流会跳转回上面的 do,然后重新执行循环中的 statement(s)。这个过程会不断重复,直到给定条件变为假为止。

例如:

/* do 循环执行 */
do
{
    printf("a 的值: %d\n", a);
    a = a + 1;
}while( a < 20 );

输出依然是10到19.这种循环方式就是先执行再判断,和while和for比有它的好处和不足,用得不多。


循环控制语句

break

C 语言中 break 语句在while循环中:

当 break 语句出现在一个循环内时,循环会立即终止,且程序流将继续执行紧接着循环的下一条语句。

语法:

break;

 即当出现break;时,程序结束循环,跳到循环后的语句执行。

例如:

int a = 10;
/* while 循环执行 */
while( a < 20 )
{
    printf("a :%d\n", a);
    a++;
    if(a > 15)
    {
      /* 使用 break 语句终止循环 */
        break;
    }
}

那么输出即为:10到15,因为当其大于15时就break了。


continue

C 语言中的 continue 语句有点像 break 语句。但它不是强制终止,continue 会跳过当前循环中的代码,强迫开始下一次循环。

对于 for 循环,continue 语句执行后自增语句仍然会执行。对于 while 和 do...while 循环,continue 语句需重新执行条件判断语句。

语法:

continue;

例如:

int a = 10;
/* while 循环执行 */
while( a < 20 )
{
    if(a == 15)
    {
      /* 使用 continue 语句继续循环,跳过{}下方语句,直接到下一次循环 */
        a++;
        continue;
    }
    printf("a :%d\n", a);
    a++;
}

那么输出即为:10到19,其中没有15,因为当其等于15时就continue了,没有执行输出语句。


goto

将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。看老师讲不讲了,这里就不讲了,因为用得不多,而且还要标记,比较麻烦。


无限循环

我们知道了在循环时有一个判断语句,如果这个判断语句一直成立,就会出现无限循环。

例如:

/* while 无限循环 */
while(1)//此时()中的内容为bool型,即只存在true和false两种形式,1表示true,0表示false,当然在这里写true和false也是可以的
{
    printf("该循环会永远执行下去!\n");
}

再例如:

/* for 无限循环 */
for( ; ; )
{
    printf("该循环也会永远执行下去!\n");
}

 当条件表达式不存在时,它会被假设为真。也可以设置一个初始值和增量表达式,但是一般情况下,C 程序员偏向于使用 for(;;) 结构来表示一个无限循环。

相对的,我们输入跳过循环的方法:

/* while 无限循环 */
while(0)//当程序看到这行就直接跳到{}下方语句了,不会执行输出
{
    printf("该循环不会执行\n");
}

但这就没有什么意义了。


左右值

  • lvalue来源于left value。 在赋值语句中lvalue = rvalue;位置处于左边。就是可以修改的值。
  • rvalue来源于right value。处于赋值语句右边,是只读的不可修改的值。

这很容易理解,就是把右值赋到左边,赋值中右值为只读的。左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。

常用的一些简便左右值赋值方式如下:

++

当我们表达变量加一的时候,有一种简便的表示方式,就是:

value++;

还有一种是:

++value;

 那么这两种有什么区别呢:

  • i++ 返回原来的值,++i 返回加1后的值。
  • i++ 不能作为左值,而++i 可以。

就是说,在只用于单句中时没什么区别。而在赋值语句中就有问题了:

int i=0,a;
a=i++//这个运算的意思是先把i的值赋予a,然后在执行i=i+1;
a=++i//这个的意思是先执行i=i+1,然后在把i的值赋予a;

就是解释里的那个意思了。


typedef关键字基础

C 语言提供了 typedef 关键字,可以使用它来为类型取一个新的名字。

语法:

typedef oldType newType;

这样操作完后就可以用newType来代替oldType了,例如:

typedef unsigned long long ULL;

表示用ULL来代替了unsigned long long ,那么我们就可以:

ULL a;//等同于unsigned long long a;

typedef 关键字一般是和结构体有关的,在之后的学习中会接触到结构体时频繁使用。


结语

本节课老师说的只是while循环,我这里把其他的循环都介绍了,在之后就可以偷懒了(不是)。希望疫情和台风快点结束吧,在宿舍上网课真的没有效率。

这里的一切都有始有终,却能容纳所有的不期而遇和久别重逢。
最后更新于 2024-01-14