Do-while循环不遵守真值赋值(C)

时间:2015-09-08 20:45:14

标签: c loops do-while truthiness

My C项目是一个Windows控制台应用程序,它从用户的音乐项目中获取时间签名和BPM,并以秒为单位返回条形码的长度。
我正在尝试使用do-while循环来添加“继续/退出?”每次成功计算结束时提示 这是该函数的源代码。它根据用户输入执行一次计算,然后终止。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char timeSignature[6];
    float BPM;
    float beatsPerBar;
    float barLength;

    printf("Enter the working time signature of your project:");
    scanf("%s",timeSignature);

    beatsPerBar = timeSignature[0]-'0';

    printf("Enter the beats per minute:");
    scanf("%f", &BPM);

    barLength = BPM / beatsPerBar;

    printf("%f\n", barLength);
    return 0;
}

每次成功计算后,我都想提示用户选择“y”返回初始输入提示,或者选择“n”结束程序并退出命令提示符。 稍后的更新包括用于添加功能的do-while循环。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <unistd.h>

int main()
{

    do{

        char timeSignature[6];
        char anotherCalculation;
        float BPM;
        float beatsPerBar;
        float barLength;

        printf("Enter the working time signature of your project:");
        scanf("%s",timeSignature);

        beatsPerBar = timeSignature[0]-'0';
        /*
         * Subtracts the integer value of the '0' character (48) from the integer value
         * of the character represented by the char variable timeSignature[0] to return
         * an integer value equal to the number character itself.
         */

        printf("Enter the beats per minute:");
        scanf("%f", &BPM);

        barLength = BPM / beatsPerBar;

        printf("%f\n", barLength);

        Sleep(3);

        printf("Would you like to do another calculation? (Y/N)");
        scanf(" %c", &anotherCalculation);

    }while((anotherCalculation = 'Y'||'y'));

    if((anotherCalculation != 'Y'||'y'))
        {
        printf("Goodbye!");
        return 0;
        }

    return 0;
}

当我编译时,没有错误,但是当我运行它时,程序在任何输入后循环。为什么代码忽略了我的真值?我该怎么做才能解决这个问题?

7 个答案:

答案 0 :(得分:4)

改变这个:

while (anotherCalculation = 'Y'||'y')

对此:

while(anotherCalculation == 'Y'|| anotherCalculation == 'y')

否则你正在做:

while (anotherCalculation = ('Y'||'y'))

注意我还将作业=更改为比较==

同样适用于if之后:

if (anotherCalculation != 'Y'||'y')

应该是:

if (anotherCalculation != 'Y'|| anotherCalculation != 'y')

顺便说一下if是多余的,你已经离开了while循环,所以用户不想再进行任何计算了。

答案 1 :(得分:3)

在进行比较之前,将您的值转换为大写字母:

while(toupper(anotherCalculation) == 'Y');

这将接受小写或大写'Y',并保持您的代码简单明了。

答案 2 :(得分:2)

您的问题出在以下代码行中:

while((anotherCalculation = 'Y'||'y'));

您的第一个问题是您正在分配变量anotherCalculation,然后测试该值。这是因为在C中,=(赋值)运算符可以在测试语句中使用,并且设置的值将返回到语句中,基本上使您的测试语句如下:

while('Y'||'y');

即使用=代替==,测试语句中的逻辑也存在错误, 你实际上在做什么与:

相同 如果TRUEanotherCalculation == 'Y',则

'y' 由于'y'实际上有一个值且标准C中FALSE0,因此您的循环将继续运行,因为它始终具有TRUE值。

要修复所有错误,该行实际需要的是:

while(anotherCalculation == 'Y'|| anotherCalculation == 'y');

最后,如果你想让这段代码更具可读性并避免双重测试,你可以将输入转换为大写并测试:

while(toupper(anotherCalculation) == 'Y');

答案 3 :(得分:2)

首先,您使用数学符号表示在C中没有意义的逻辑检查,并且您使用的是赋值=运算符而不是“test for equivalence”==运算符

}while((anotherCalculation = 'Y'||'y'));

应该是:

}while((anotherCalculation == 'Y'|| anotherCalculation == 'y'));

Second, save yourself some hassle down the road, and use fgets() to get a line of a text, and parse it

最后,使用scanf()fgets()阅读“尾随换行符”等内容。 The scanf() function, for example, won't "eat up" the newline at the end of your input, and you'll get unexpected behavior. This very question appears on SO once per month at least.

答案 4 :(得分:2)

逻辑运营商不会那样工作。 x == a || b并未评估为&#34; x等于ab&#34 ;;相反,它评估为&#34; x等于布尔表达式(ab)&#34;的结果。如果要将x与不同的值进行比较,则必须将其写为

x == a || x == b 

但是你有另一个问题,你已经使用了赋值运算符=,你打算使用比较运算符== 1

while((anotherCalculation = 'Y'||'y'))
                          ^
                          |
                        ooops

您正在执行两个非零值的逻辑或,其值为1(真),将结果分配给anotherCalculation。表达式的结果是赋值(1)后anotherCalculation的值,因此您 有效地

while( true )

您需要使用==运算符进行相等性比较,并且必须在||运算符的每一侧进行显式比较:

while ( anotherCalculation == 'Y' || anotherCalculation == 'y' )

在进行比较之前,您可以通过将输入转换为特定情况来清除这一点,完全不需要||运算符:

while ( tolower( anotherCalculation ) == 'y' )

while ( toupper( anotherCalculation) == 'Y' )

<小时/> 1。 一位名叫李志的聪明的年轻编码员 希望在i为3时循环 撰写=时 他忘记了续集 因此无限循环

答案 5 :(得分:1)

这不符合您的期望:

}while((anotherCalculation = 'Y'||'y'));

这也不是:

if((anotherCalculation != 'Y'||'y'))

你应该这样做:

}while((anotherCalculation == 'Y') || (anotherCalculation =='y'));

而且:

if((anotherCalculation != 'Y') && (anotherCalculation !='y'))

答案 6 :(得分:0)

TLDR;将您的条件更改为

while( anotherCalculation == 'Y' || anotherCalculation == 'y' );