代码似乎有逻辑错误,但是当我 运行 它按我想要的方式工作

The code seems to have a logic error but when I run it works the way I would like

我试图将摄氏温度转换为华氏温度和开尔文温度,但程序要求用户输入要进行何种转换的部分似乎存在逻辑错误。

#include <stdio.h>
#include <stdlib.h>
#define Fx 1.8
#define Fy 32
#define Kx 273.15
int main(){
    double c;
    double f;
    int choice;
    printf("Convert Celsius to:\n[1] Fahrenheit\n[2] Kelvin\n");
    do{
        printf("Choose: ");
        scanf("%i", &choice);
    }while(choice != 1 && choice != 2); 
    if (choice == 1){
        printf("°C = ");
        scanf("%lf", &c);
        f = c * Fx + Fy;
        printf("°F = %f\n", f);
    }
    else{
        printf("°C = ");
        scanf("%lf", &c);
        printf("°K = %lf\n", c + Kx);
    }

   
    return 0;
}

while(choice != 1 && choice != 2);部分应该有逻辑错误。运算符检查 choice 是否不同于 1 和 2。如果用户输入为 1,则运算符应为 false 和 true,然后重新 运行 查询,但它会正常执行。应该有一个问题,运行 一遍又一遍地问同样的问题,但事实并非如此。当我使用布尔运算符||时,重复的问题happens.I想知道这里发生了什么。

while(choice != 1 && choice != 2);部分没有逻辑错误

当输入1时,choice != 1为假,所以条件为假,循环结束。

当输入2时,choice != 1为真,而choice != 2为假,所以条件也为假,循环结束

当输入3时,choice != 1choice != 2都为真,所以条件为真,继续循环。

但是,您的代码有问题:您没有检查 scanf() 的 return 值。例如,当先输入 3,然后输入 a 时,a 不是 %i 的有效输入,因此不会被消耗。 choice 保持 3 并且无限循环。

您希望 choice 成为 12。所以,如果

你会很好
(choice == 1) || (choice == 2)

这意味着如果它的否定为真,你想进入循环,或者

!((choice == 1) || (choice == 2))

只要应用德摩根定律,你就会得到

( !(choice == 1) && !(choice == 2) )

((choice != 1) && (choice != 2))

这表明你所拥有的不是错误。