8

有几篇关于 while 循环中的 switch 语句的帖子,除了它们都不是在 C 中完成的,至少从我所看到的来看。C++ 可以创建布尔表达式,我知道,但在 C 中却不行。我有一个包含开关控件的 while 循环。但是,当我在 switch 中编写 break 语句时,它会回到循环的开头并使我的程序永远运行。忽略我使用的功能,因为它们确实有效。我只需要澄清一下我对嵌套的处理。谢谢!

Here is my main.c:

while(1)
{
    printf("0) Exit\n1) List Tasks\n2) Add Task\n");                                            
    printf("3)Delete Task\n4) Add Task From File\n");                                           
    printf("What would you like to do?\n");
    fgets(buf1, 50, stdin);                                                                     
    p = atoi(buf1);
    switch(p)
    {
          case 0: 
            break;
          case 1: 
            printTaskList(pTaskList);
            break;
          case 2:
            printf("Enter task name: ");
            fgets(buf2,100,stdin);
            printf("Enter task priority: ");
            fgets(buf3,100,stdin);
            printf("Enter task start date: ");
            fgets(buf4,50,stdin);
            pTask = makeTask(buf2,buf4,buf3);
            addTaskToEnd(pTaskList,pTask);
            break;
          case 3:
            printTaskList(pTaskList);
            printf("What task would you like to delete? ");
            fgets(buf6,50,stdin);
            taskNum = atoi(buf6);
            removeTask(pTaskList,taskNum);
            break;
          case 4:
            printf("Enter the filename ");
            fgets(buf7,50,stdin);
            break;
          default:
            printf("ERROR: %d: Incorrect menu option\n", p);
     }
}
4

6 回答 6

17

break;将退出最近的封闭switch或循环。要跳转两个级别,您必须使用 dreadedgoto或重新组织 areturn以完成所需的语义。

while(1) {
    switch(x) {
    case 0: goto EndWhile;
    }
}
EndWhile: ;

或者

void loop() {
    while(1) {
        switch(x) {
        case 0: return;
        }
    }
}
//...
loop();
//...

您完全可以在 C 中使用布尔表达式。只需使用int.

int quit = 0;
while(!quit) {
    switch(x) {
    case 0: quit = 1; break;
    }
}

如果你真的想要的话,C 也有一个布尔数据类型。

#include <stdbool.h>

bool quit = false;
while(!quit) {
    switch(x) {
    case 0: quit = true; break;
    }
}

还有一个选择,对于完全疯狂的人。

#include <setjmp.h>

jmp_buf jbuf;
if (!setjmp(jbuf))
    while(1) {
        switch(x) {
        case 0: longjmp(jbuf, 1);
        }
    }
于 2013-04-20T06:16:11.680 回答
1

您也可以在 C 中使用布尔表达式。1999 年的 C 标准具有stdbool.h标头和数据类型bool。在较旧的 C 方言中,例如 Visual Studio 2012 (!) 中的方言,没有布尔数据类型,因此您需要改用纯整数:

int keep_looping = 1;
while (keep_looping) {
    ....
    if (....)
        keep_looping = 0;
}
于 2013-04-20T06:18:42.960 回答
0

C++ 可以创建布尔表达式,我知道,但在 C 中不行。

哦?那么0 == 0,如果不是布尔表达式,那又是什么呢?如果您指的是类型的变量,请bool确保您是#include <stdbool.h>.

但是,当我在 switch 中编写 break 语句时,它会回到循环的开头并使我的程序永远运行。忽略我使用的功能,因为它们确实有效。我只需要澄清一下我对嵌套的处理。谢谢!

不,它不会回到循环的开头。从 switch 语句的末尾继续执行(紧接在switches 右大括号之后})。在您的情况下,这在功能上与返回循环的开头相同。

有几个选项可供您使用。其他人建议使用唯一变量来控制您的循环。这将是一个好主意,但他们建议使用变量,尽管变量已经存在于您的逻辑中。如果您想以这种方式解决问题,请考虑:

do {
    /* ... */
} while (p != 0);

或者,return当您想要退出时从 main 或exit(0);从其他函数调用。如果您想运行额外的清理/输出代码,这并不是很有帮助。

在这种情况下,switch控制结构实际上并不比if/ else if/else分支链好。如果您要使用if//分支else ifelse您将能够break;更轻松地跳出循环。switch当我希望执行流向其他情况时,我会使用控制结构。

作为另一种选择,您可以使用goto表达式跳出循环到 main 之外的标签。当循环中有多个可能的退出点时,这将是最好的,例如分配错误后的处理和清理。

于 2013-04-20T06:38:53.630 回答
0

你永远不会退出循环。休息只会破坏你的开关。你应该更换

while(1)

其他暗示应该退出while循环的东西

于 2013-04-20T06:16:00.163 回答
0

你的 break 只留下 switch 语句,然后在

while(1)

永远循环。

于 2013-04-20T06:16:54.070 回答
0

使用退出(0);
无论你想离开哪里。

In this partcular case you have to put the condition in the while loop parameter

从while循环中出来的其他方法可能是使用: return语句。但这也会退出当前函数。

适当的解决方案可能是goto label;在开关内部使用,然后label: statement;在 while 循环外部使用。

例如:

while(1){
  switch(x){

   case 0:goto label;

   default:break;
   }
}
label:
printf("out of while loop");
于 2014-06-15T16:24:39.173 回答