1

所以我有一个关于bool变量的问题。

这是一个检查是否按时支付到期款项的程序,如果未按时支付,则乘以 1.10。

#include <iostream>
using namespace std;
int main()
{
    float Dues;
    cout<<"Enter ammount: \n";
    cin>>Dues;
    cout<<"On time? (y/n)";
    char yn;
    cin>>yn;
    bool Overdue = yn !="y"; //TRUE (1) if it is late, FALSE (0) if it is on time
    float AmountDue;
    AmountDue = Overdue ? Dues*1.10 : Dues;
    cout<<"Ammount due: ";
    cout<<<<AmountDue;
    return 0;

}

我不明白布尔的逻辑

我们有

bool Overdue = yn !="y";

现在这是我对布尔逻辑的理解,这是不对的

如果输入“n”=> N 不是 Y,这是正确的,因此 bool 为真 => 1

如果输入“y”=> Y 不是 Y,这是错误的,因此 fasle => 0

但实际上恰恰相反,我无法从逻辑上对自己进行解释。基于什么逻辑bool Overdue = yn !="y";

4

2 回答 2

2

出现意外行为的原因是您将 achar与字符串文字进行比较"y"。字符串文字的类型const char[n]n文字的长度,包括终止 NUL 字符。

与字符文字进行比较:

yn != 'y'

当你这样说:yn != "y"时,char 被提升为,int字符串文字衰减为const char*。标准未指定这应该如何表现。

表达式的结果存储在bool Overdue. 当ynhold'n'时,表达式是true('n' 确实不同于 'y')所以true将被存储,反之亦然)。

于 2012-12-14T13:33:39.370 回答
2

除了 jrok 的回答之外,您遇到的问题是您假设小写和大写字符是同一回事。他们不是。'y' 和 'Y' 是两个不同的字符。'n' 和 'N' 也一样。

你写:

如果输入“n”=> N 不是 Y,这是正确的,因此 bool 为真 => 1

不,“n”不是“y”。

如果输入“y”=> Y 不是 Y,这是错误的,因此 fasle => 0

这是正确的。“y”不是“Y”。

试试这个:

bool Overdue = (yn != 'n') && (yn != 'N');
于 2012-12-14T13:47:30.097 回答