不间断交替while循环 int number=0; while(scanf(“%d”、&number)){ 如果(sayi==1 | | sayi==2){ printf(“登录成功”); 打破 } }

不间断交替while循环 int number=0; while(scanf(“%d”、&number)){ 如果(sayi==1 | | sayi==2){ printf(“登录成功”); 打破 } },c,if-statement,while-loop,scanf,C,If Statement,While Loop,Scanf,我如何才能在没有中断的情况下编写此代码?Abreak在这里更好。它更密切地暗示了更优化的装配输出。 但是您可以始终使用另一个变量(顺便说一句,您对scanf的错误检查是错误的) 我建议不要尝试在状态下填充所有内容。它的可读性较差,即使scanf故障最终导致跳出循环(例如,如果/*处理错误*/部分中有not_break=0),您通常仍希望对错误做出不同于对不同输入选择的响应。单独的if是提供此类单独响应的更干净的方法 (我还冒昧地将sayi更改为number,因为使用一个不相关的变量似乎是一个编

我如何才能在没有中断的情况下编写此代码?

A
break
在这里更好。它更密切地暗示了更优化的装配输出。 但是您可以始终使用另一个变量(顺便说一句,您对
scanf
的错误检查是错误的)


我建议不要尝试在
状态下填充所有内容。它的可读性较差,即使
scanf
故障最终导致跳出循环(例如,如果
/*处理错误*/
部分中有
not_break=0
),您通常仍希望对错误做出不同于对不同输入选择的响应。单独的
if
是提供此类单独响应的更干净的方法


(我还冒昧地将
sayi
更改为
number
,因为使用一个不相关的变量似乎是一个编码错误。)

中断
指令只是一个跳转。您可以改用
goto
语句。但是,使用
goto
是一种不良做法。使用
中断
,代码看起来很好。不管怎样,这就是你用
goto
编写它的方式:

整数;//删除了任务,因为它是不必要的。
while(scanf(“%d”、&number)){
如果(数字==1 | |数字==2){//我相信你的意思是数字而不是说你好。
printf(“登录成功”);
去打破你的标签;
}
}
断开标签:
//将其他工作放在此处,如果这是主任务的结尾,则返回0。

另一种方法是使用@PSkocik在另一个答案中提到的标志变量。

您可以在while条件中使用三元运算符:

while (
       scanf("%d",&number) == 1 && 
       (sayi == 1 || sayi == 2) ? (printf("Login succesful"), 0) : 1
);
您还可以链接
&&
| |
运算符并使用短路:

while (
       scanf("%d",&number) == 1 && 
       !( (sayi == 1 || sayi == 2) && (printf("Login succesful"), 1) )
);

首先,请注意while语句中的条件

while (scanf("%d",&number)){
即使调用
scanf
未成功,也可以计算为true。因此,至少写一篇文章是正确的

while(scanf(“%d”,&number)==1){

至于循环,那你就在这里

int number = 0;

while ( number != 1 && number != 2 && scanf("%d",&number) == 1 )
{
    if ( number == 1 || number == 2 ) printf("Login succesful ");
}

注意:
sayi
似乎不会在循环中被更改。因此它的检查最好放在循环之外。或者你只是把它与
number
混淆了(这更有意义)。请不要发布不反映你的问题的代码


但是,为了放弃另一种方法,假设有任何东西可以进一步改变循环中的变量
sayi

您还可以使用带有标志变量的
do while
循环:

int i = 1;

do {
       // Anything that changes sayi (related to variable number).

       if ( sayi == 1 || sayi == 2 ) {
           printf("Login successful. ");
           i = 0;
       }

} while ( i || (scanf("%d",&number) == 1 )

旁注:

  • 虽然(scanf(“%d”,&number))
    是危险的/不正确的,就像发生输入错误一样,但返回的值将是
    EOF
    的负值,该值将被计算为
    true
    ,循环将继续,尽管存在错误。请改用
    scanf(“%d”,&number)==1
    作为条件

  • break
    有什么问题,以至于您不想使用它?函数族将在出错时返回
    EOF
    EOF
    定义为负值(通常为
    -1
    ),在条件中使用时,该值将隐式转换为“true”。因此,如果出现错误或用户按下文件结尾键盘组合,您将有一个无限循环。将返回值与
    1
    进行显式比较。如
    scanf(…)==1
    @Burakkepuc,这并不能回答我的问题,continue/break没有问题。您可以使用
    goto
    s。您可以(ab-)使用
    &&
    |
    运算符或三值运算符,将
    printf
    置于该条件下。为什么要使用它?如果
    在循环内部,为什么需要
    呢?如果
    sayi
    实际上在循环内部会发生变化吗?如果不仅仅是在循环外部,然后是在bod中的
    else
    案例的y。或者
    if
    条件应该检查
    number
    ?请注意,逻辑上使用变量
    number
    检查它是否包含
    1
    2
    ,但在OP的代码中,它是神秘的
    sayi
    ,似乎与
    numb>无关呃
    @roberts-supportsmonicacellio是的。我认为这是一个错误。我已经在答案中编辑了一段关于它的内容。谢谢你提到它!这很棘手。注意。-OP的意思可能是
    number
    而不是
    sayi
    ,但它仍然是个谜。
    int i = 1;
    
    do {
           // Anything that changes sayi (related to variable number).
    
           if ( sayi == 1 || sayi == 2 ) {
               printf("Login successful. ");
               i = 0;
           }
    
    } while ( i || (scanf("%d",&number) == 1 )