0

在这里,我有一个代码应该在循环的第一个序列之后打印“错误” ,因为根据我之前的问题Print an “Error” statement after do-while loop in C它只会读取循环的第一个条件,因为“ short cicuiting ”并且只会在循环的第一个序列之后执行......在解决之后我仍然无法显示“错误!”,所以我尝试添加&& getch()它给了我一个输出

Error!

现在我有 3(多个)条件导致“错误!” 要在第一个序列中执行,我想知道C 如何响应我的多个条件,这可能有助于我解决错误。

我的代码:

#include <stdio.h>
#include <conio.h>

void main(){
    int inp;
    while(inp<10 && printf("Error") && getch()){
        clrscr();
        printf("Enter Number > 10: ");
        scanf("%d",&inp);
    }
    printf("Right Answer!");
    getch();
}
4

3 回答 3

3

int inp;未初始化。也main应该返回int。自动变量未初始化为默认值。像这样的测试inp<10是未定义的,因为inp可以是任何垃圾值。

这就是你所需要的:

#include <stdio.h>

int  main(){
    int inp = 0;
    while(inp<10 && printf("Error\n") )
    {
        printf("Enter Number > 10: ");
        scanf("%d",&inp);
    }
    printf("Right Answer!");
    getchar();
}

conio.h不是 C 标准库的一部分。但正如 unwind 在评论中所说,上述代码将Error不必要地打印一次 - 您可以将代码重新设计为:

#include <stdio.h>

int  main(){
    int inp = 0;
    while(1 ) // always true
    {
        printf("Enter Number > 10: ");
        scanf("%d",&inp);
        if(inp<10 )
            printf("Error\n");
        else
            break; // break out of while loop
    }
    printf("Right Answer!");
    getchar();
}
于 2013-10-31T13:23:07.127 回答
1

根据C 语言的短路评估&&,如果你有,||或者?如果没有必要,它不会评估所有条件,请参见示例:

if(0 && printf("ERROR!\n"))
  printf("OK\n");

永远不会打印任何文本,因为(0 && whatever)总是会评估为假,所以它不会在第二个条件之后继续,&&但如果你会改变位置

if(printf("ERROR!\n") && 0)
      printf("OK\n");

将仅打印,ERROR!因为printf("ERROR!\n")将打印文本并返回一些大于零 (7) 的数字,因此条件将减少到(7 && 0)将两个条件评估为假但会打印您的ERROR!消息。

当您有更多&&运算符时,它们将按从左到右的顺序进行评估,因此它看起来像这样:

if( ( (inp<10 && printf("Error")) && getch() ) && ... )

所以它会首先检查是否inp小于 10,只有当它是真的才会继续打印Error等等......

于 2013-10-31T14:31:42.487 回答
0
int main(){
    int inp = 0;
    scanf("%d",&inp);


    while(inp<10 && printf("Error") && getch()){
        clrscr();
        printf("Enter Number > 10: ");
        scanf("%d",&inp);
    }
    printf("Right Answer!");
    getch();

   return 0;
}

在签入循环之前,您必须对 inp 进行初始化/赋值。

于 2013-10-31T13:24:20.797 回答