带有开关语句的 for 循环

for loop with switch statements

本文关键字:for 循环 语句 开关      更新时间:2023-10-16

我对 C/C++ 相对较新,我想知道如何使用 for 循环,这样我就不必做一堆开关语句我已经做了开关语句我只需要帮助将 for 循环集成到其中。谢谢。

#include <stdio.h>
#pragma warning(disable :   4996)   
int main()  {
    char    ch;
    ch = getchar();
    int f, a = 10, b = 20;
    printf("ch  =   %cn", ch);

    switch (ch) {
    case '+':   f = a + b;  printf("f   =   %dn", f); break;
    case '-':   f = a - b;  printf("f   =   %dn", f); break;
    case '*':   f = a * b;  printf("f   =   %dn", f); break;
    case '/':   f = a / b;  printf("f   =   %dn", f); break;
    default:    printf("invalid operatorn");
    }
}

该程序的目的是输入 +,-,*,/然后根据该输入,它将执行输入的情况,因此 + 将添加 a 并在一起。

基本上,您需要将运算符字符映射到操作。

当前代码表示通过执行流控制的映射。

C++标准库的 map 集合是一个不错的选择,可以将其表示为数据,这样您甚至不需要使用循环。在 C 语言中,每个结构数组都包含一个char和一个函数指针,可以执行相同的工作。但是,您必须自己定义函数,因为与C++标准库不同,C 标准库不提供方便的算术运算命名函数。


以类似的方式,布尔状态,无论某物是真还是假,都可以表示为执行位置或数据,通常表示为bool类型的变量。选择什么主要是工程直觉。有时通过流控制表示是最简单和最清晰的,有时表示为数据是最简单和最清晰的。


C++示例,主要重现给定示例代码的效果,但将映射作为数据:

#include <iostream>
#include <functional>
#include <map>
using namespace std;
auto main() -> int
{
    const map<char, function<int(int,int)>> op =
    {
        { '+', plus<int>() },
        { '-', minus<int>() },
        { '*', multiplies<int>() },
        { '/', divides<int>() }
    };
    char  ch;
    cout << "Operator? ";  cin >> ch;
    cout << "ch = '" << ch << "'n";
    if( op.count( ch ) == 0 )
    {
        cout << "invalid operatorn";
    }
    else
    {
        const int a = 10;
        const int b = 20;
        cout << "f   =   " << op.at( ch )( a, b ) << "n";
    }
}

相应的 C 示例,其中确实包括问题中提到的 for 循环:

#include <stdio.h>
int plus( int a, int b )        { return a+b; }
int minus( int a, int b )       { return a-b; }
int multiplies( int a, int b )  { return a*b; }
int divides( int a, int b )     { return a/b; }
typedef int(*Func_ptr)(int, int);
struct Mapping
{
    char        ch;
    Func_ptr    f;
};
const struct Mapping op[] =
{
    { '+', plus },
    { '-', minus },
    { '*', multiplies },
    { '/', divides }
};
const int n_ops = sizeof( op )/sizeof( *op );
Func_ptr op_at( char ch )
{
    for( int i = 0; i < n_ops; ++i )
    {
        if( op[i].ch == ch ) { return op[i].f; }
    }
    return NULL;
}
int main()
{
    int  ch;        // Note: type `int` to accommodate EOF value.
    printf( "Operator? " );  ch = getchar();
    printf( "ch = '%c'n", ch );
    if( op_at( ch ) == NULL )
    {
        printf( "invalid operatorn" );
    }
    else
    {
        const int a = 10;
        const int b = 20;
        printf( "f   =   %dn", op_at( ch )( a, b ) );
    }
}

我认为 C11 引入了一些用于有效重载函数的机制,因此它们可以像C++中的重载函数一样使用。我不太记得了,也没有在这里使用它。我建议,如果您需要处理不同的数据类型,只需使用不同的函数名称。


请注意,C 示例也编译为 C++,因此这两个示例在技术上都是C++的。但是,最后一个示例是 C 样式,使用 C 惯用法和 C I/O,并执行C++中不必要的操作。我们通常只是说这样的代码是C,而不是C风格;这样的代码可能并不总是编译为C++,因为虽然 C 在很大程度上是C++的子集,但它们是两种不同的、独立的语言:从技术上讲,没有 C/C++ 这样的东西。

我想知道如何使用 for 循环,这样我就不必做一堆开关语句,我已经做了开关语句,我只需要帮助将 for 循环集成到其中。

for循环用于重复语句块,直到满足条件。

switch语句用于根据给定值决定运行哪个语句块,而不是使用一堆 if 语句。

switch 语句替换为 for 循环是没有意义的。有意义的是在循环中使用 switch 语句来操作循环生成的内容,例如请求用户输入。 例如:

#include <stdio.h>
#pragma warning(disable :   4996)   
int main()  {
    int f, a = 10, b = 20;
    char ch;
    int finished = 0;
    do {
        ch = getchar();
        printf("ch  =   %cn", ch);
        switch (ch) {
            case '+':   f = a + b;  printf("f   =   %dn", f); break;
            case '-':   f = a - b;  printf("f   =   %dn", f); break;
            case '*':   f = a * b;  printf("f   =   %dn", f); break;
            case '/':   f = a / b;  printf("f   =   %dn", f); break;
            case 'q':   finished = 1; break;
            default:    printf("invalid operatorn"); break;
        }
    }
    while (!finished);
    return 0;
}