C 语言哨兵控制循环和计数器控制循环的区别

2025年1月7日 | 阅读 6 分钟

在本文中,您将了解 C 语言中 **Sentinel** 和 **Counter Controlled Loop** 的区别。但在讨论它们的区别之前,您必须了解 Sentinel 和 Counter Controlled Loop。

什么是 Sentinel-Controlled Loop?

一种循环,其执行一直持续到遇到一个特定值(称为 **“哨兵值”(sentinel)**)为止,称为 **哨兵控制循环(sentinel-controlled loop)**。循环的值指示循环的终止。

终止条件

在此循环中,程序将一直运行 **直到** 遇到预定的哨兵值。

特性

C 语言中的 Sentinel Controlled Loop 有几个特性。Sentinel Controlled Loop 的一些主要特性如下:

  1. 灵活性:它更通用,因为哨兵控制循环中的迭代次数是由 **外部输入** 设置的。
  2. 动态终止:发现哨兵值时,**循环中断** 并适应新输入。
  3. 示例:读取用户输入,直到用户输入一个特定字符或数字来指示其输入已结束。

示例

让我们举一个例子来说明 C 语言中的 **哨兵控制循环**。

输出

Enter characters (terminate with 's'): wrgs
Entered: w
Entered: r
Entered: g

说明

1. 头文件包含

#include <stdio.h>:包含标准输入输出库,可以使用 printf 和 scanf 等函数进行输入输出操作。

2. main 函数

int main() {... }:每个 C 程序都以此为主函数开始和结束。从这里开始执行。

3. 变量声明

使用 **'char input;'** 语法声明字符变量 input。此变量将用于存储用户输入。

4. 输出提示

printf("Enter characters (terminate with's'):");:它在控制台上打印一条消息,提示用户输入字符。用户被指示通过输入 **字符 's'** 来终止输入。

5. While 循环

while (1) {... }:这是一个无限 while 循环,意味着只要括号中的条件成立,它就会一直运行。在这种情况下,1 始终为真,因此会产生一个无限循环。

6. 用户输入

scanf("%c", &input);:此函数从用户读取一个字符并将其赋给 input 变量。 **%c** 前的空格会消耗输入缓冲区中可能剩余的任何前导空格(包括换行符)。

7. 循环退出条件

if (input == 's') { break; }:它检查输入的字符是否等于 **'s'**。如果为真,则执行 break 语句,导致程序 **退出** 循环。

8. 处理和显示输入

printf("Entered: %c\n", input);:如果输入的字符 **不是 's'**,则进行处理。然后,在控制台上打印的消息中显示输入的字符。

9. 无限循环机制

**while (1)** 结构创建一个无限循环,直到用户输入字符 **'s'**,触发 break 语句。

10. Return 语句

return 0;:它表示 main 函数的结束,并向操作系统提供 **0** 的 **退出** 状态,表示成功执行。

总之,此程序使用 while 循环连续读取用户的字符,直到用户输入字符 's',此时程序退出循环。循环输入的字符会被处理并在控制台上显示。

什么是 Counter-Controlled Loop?

一种循环,它由一个循环控制变量(通常称为 **计数器**)来确定和调节 **计数器控制循环(counter-controlled loop)** 的迭代次数。

终止条件

直到循环控制变量达到 **预定值**,循环才会继续。

特性

C 语言中的 Counter Controlled Loop 有几个特性。Counter Controlled Loop 的一些主要特性如下:

  1. 固定迭代次数:计数器控制循环在循环开始前就有固定且已知的迭代次数。
  2. 可预测性:迭代次数由循环控制变量的初始值、条件和更新确定。
  3. 示例:执行代码块固定次数,该次数是预先已知的。

示例

让我们举一个例子来说明 C 语言中的 **计数器控制循环**。

输出

#include <stdio.h>
int main()
{
    int m;
    // Loop Looptes 5 times (i takes values 1 through 5)
    for (m = 1; m <= 5; m++)
    {
        // Process the iteration
        printf("Value of Iteration - %d\n",m);
    }
    return 0;
}

说明

1. 头文件包含

#include:此行包含标准输入输出库,允许使用 printf 等函数进行输出。

2. Main 函数

{... } int main():每个 C 程序都以此为主函数开始。这是执行的起点。

3. 变量声明

使用 **'int m;'** 语法声明整数变量 m。接下来的循环将使用此变量作为循环控制变量。

4. For 循环

for (m = 1; m <= 5; m++) {... }:这是一个 for 类型的计数器控制循环。

  • 初始化:'m = 1;' 这将循环控制变量 m 初始化为 1。
  • 条件:循环条件是 **'<= 5;'**。只要此条件成立,循环就会一直继续。
  • 更新:每次迭代后,**'m++'** 将 m 的值加 1。

5. 循环体

**for 循环** 会执行大括号 {... } 内的代码。

  • printf("Value of Iteration - %d\n", m);:每次打印此行时,m 的值都会更新。 \n 代表换行符,而 %d 是一个格式说明符,表示一个整数。

6. Return 语句

return 0;:它表示 main 函数的结束,并向操作系统提供 0 的退出状态,表示 **成功执行**。

总之,此程序使用 **for 循环** 迭代五次,在每次迭代中打印循环控制变量 m 的值。循环控制变量从 1 开始,每次迭代增加 1。循环一直重复,直到变量的值达到或超过 5。

Sentinel 和 Counter Controlled Loop 的主要区别

C 语言中的 Sentinel 和 Counter Controlled Loop 之间有几个主要区别。这些循环之间的一些主要区别如下:

特点Sentinel Controlled LoopCounter Controlled Loop
条件检查依赖于一个条件(哨兵值)变量来终止循环。使用计数器或索引变量来确定迭代次数。
初始化在循环内部使用哨兵值之前,必须先对其进行初始化。在进入循环之前,必须先对计数器变量进行初始化。
循环控制变量通常,循环控制变量的修改在循环体内部进行。通常,循环控制变量在循环体的开头或结尾进行递增或递减。
终止条件当达到哨兵值或特定条件变为真时,循环终止。当计数器变量达到指定值或基于关系条件时,循环终止。
示例while(q!=-1)
{
//循环体
scanf("%d", &q);
}
for(q=0;q<10;q++)
{
//循环体
}
用例当迭代的确切次数不确定并且取决于输入或动态条件时,适合使用。当迭代次数已知或可以轻松确定时,适合使用。