C:结合 while 和 if 语句

Posted

技术标签:

【中文标题】C:结合 while 和 if 语句【英文标题】:C: Combining while and if statements 【发布时间】:2019-04-08 07:54:54 【问题描述】:

我正在尝试用 C 编写一个程序,该程序根据用户提供的输入调用两个函数之一。

如果用户输入“1”,程序应该说“你选择了 A”,如果用户输入“2”,程序应该说“你选择了 B”。我遇到的问题是,无论用户输入 1 还是 2,都会返回消息“您选择 A”(请参见屏幕截图)。

Selection 1

Selection 2

这是我的代码:

include <stdio.h>

void celsiusFahrenheit()

    printf("You chose A");


void fahrenheitCelsius()

    printf("You chose B");


int main()

    int selection;
    printf("Please enter '1' to convert celsius to fahrenheit, or enter '2' to convert fahrenheit to celsius: ");
    scanf_s("%d", &selection);
    while (selection < 1 || selection > 2)
    
        printf("Please enter a valid entry of either 1 or 2: ");
        scanf_s("%d", &selection);
    
    if (selection = 1)
    
        celsiusFahrenheit();
    
    else
    
        fahrenheitCelsius();
    

如果您能提供任何帮助,我将不胜感激!

【问题讨论】:

selection = 1 是赋值而不是相等比较 (==)。如果你在编译时使用了一些防御性标志(如 gcc/clang 的 -Wall),你的编译器会警告你。 if (selection = 1) 更改为if (selection == 1)。这是一个常见的错误。增加编译器警告,并可能将代码设置为if (1 == selection),以在键入错误时产生错误。 @PSkocik Clang 有 -Weverything 谢谢,伙计们。这真的很有帮助! @FiddlingBits: -Weverything 警告太多——我不认为它可用于生产代码,因为它会抱怨,例如,如果您使用 #define _XOPEN_SOURCE 700 启用 POSIX 功能,因为名称保留用于实现。是的,我知道它是;这就是我使用它的原因!它必须经过调整才能真正与许多-Wno-xyz 选项一起使用。我使用-Weverything -Wno-padded -Wno-vla -Wno-reserved-id-macro -Wno-documentation-unknown-command 让事情对我来说足够健康。我也使用-Werror,所以我不会在编译时出现任何警告。 【参考方案1】:

您将一个整数常量分配给一个整数 (selection = 1) 并检查它的真值,它将始终为真。 正如 cmets 中已经指出的那样,您可以使用 -Wall 选项,它会警告您,

warning: suggest parentheses around assignment used as truth value [-Wparentheses]

 if (selection = 1)

     ~~~~~~~~~~^~~

或者像这样改变if条件:

 if (1 == selection)

如果您在上述语句中犯了同样的错误(赋值),即使没有-Wall 选项,编译器也会产生错误,您可以在程序中避免这个错误。

【讨论】:

以上是关于C:结合 while 和 if 语句的主要内容,如果未能解决你的问题,请参考以下文章

结合“if”和“while”,当“if”条件满足时如何跳出所有嵌套循环?

while和if的区别

将“for”循环与 if-else 语句相结合,每个“if”语句中都有多个条件

函数与字典,可选参数和while语句结合的简单应用

C语言-语句知识点

Linux Shell:Shell循环语句