C++ && 条件从未执行

c++ && conditional never executed

我正在尝试为计算长途电话费率的作业创建一个程序,该程序接受开始时间和通话时长,并输出总成本和净成本。 涉及到几个参数,我已经在条件语句中实现了,

但是,第一个条件代码从未执行过,我已经尝试了几种不同的操作数,但仍然没有弄明白。

#import <iostream>


using namespace std;

int main() {

//declare variables
int startTime;
int callLength;
double grossCost = 0;
double netCost;
const double callRate = 0.35;
const double fedTax = 0.04;
const double discount1 = 0.50;
const double discount2 = 0.16;


//begin user prompt
cout << "Enter start time: " << endl;
cin >> startTime;
cout << "Enter length of call in minutes: " << endl;
cin >> callLength;

//define our grossCost
grossCost = (callLength * callRate);

//lez do some conditionals
    if ((startTime >= 1800) && (startTime <= 800)){

        netCost = grossCost - (grossCost * discount1);
        netCost *= fedTax;
    }

    else if (callLength > 60){
        netCost = grossCost - (grossCost * discount2);
        netCost *= fedTax;
    }
    else{
        netCost = (grossCost * fedTax);
    }

    //print out our final costs
    cout << "gross cost : " << "$" << grossCost << endl;
    cout << "net cost: " << "$" << netCost << endl;

    return 0;

    }

所以,当尝试输入时:

Enter start time: 2322
Enter length of call in minutes: 67
gross cost : .45
net cost: [=11=].78792

netcost 未被正确评估,因为它跳过了第一个条件,即使 startTime 的值符合参数。 输出应该是:

    Enter start time: 2322
    Enter length of call in minutes: 67    
    gross cost: .45
    net cost: .24 

我不是在找人帮我做功课,只是一些指引我朝着正确的方向前进,我已经多次检查条件,但我仍然对为什么它没有评估感到困惑。感谢任何帮助,谢谢。

x > 1800 和 x < 800 怎么可能同时为真?。如果第一个为真,则该陈述将永远为假。

你这里有一个逻辑错误:一个数不能同时大于等于1800小于等于800。修改第一个条件。我会把它分成两部分

if((time >= 1800 & <=2400) || (time >= 0 && time <= 800)).

这里实际的逻辑错误是调用 下午 6 点后上午 8 点前 将存在于不同的日子!所以我们确实需要两个条件来同时检查日期的边界。

根据@Reto Koradi 的评论进行编辑:

如果我们省略边界检查,结果不会改变。如上所述,更改的要点是突出两个条件的互斥性,这是通过将 && 换成 ||:

来实现的
if (time >= 1800 || time <= 800)

问题是

if ((startTime >= 1800) && (startTime <= 800)){

这两个条件是互斥的。没有大于 1800 且同时小于 800 的数字。您可能希望像这样修复比较条件(感谢 iksemyonov 的评论,为未来的读者改进。请参考他对同一问题的回答)

if ((startTime >= 1800) || (startTime <= 800)){

为什么它不起作用的解释相当明显,并且已在其他答案中涵盖。这个表达式永远不可能为真,因为没有数字既大于 1800 又小于 800。

if ((startTime >= 1800) && (startTime <= 800)){

&& 运算符测试两个条件是否为真。

更有趣的部分是为什么人们会犯这个错误。在开始使用逻辑表达式时,您既不是第一个也不是最后一个掉入这个陷阱的人。

我认为原因是在自然语言中,我们使用单词 "and" 的方式与逻辑运算符非常不同。当您说 "before 8 am and after 6 pm" 时,"and" 更符合 "union" 集合操作。您基本上是在定义一个包含 "all times before 8 am" 和 "all times after 6 pm" 的集合,这是一个集合并集。

与"union"集合运算匹配的逻辑运算符是逻辑"or"。至少一个输入集中的任何元素都是并集的一部分。因此,对于两个集合的并集,并集是包含第一个集合 第二个集合中的元素的集合。

明白了这一点,正确的条件是:

if ((startTime >= 1800) || (startTime <= 800)){

其中 || 是逻辑 "or" 运算符。

与日常语言中使用方式不同的逻辑运算并不少见。所以在将语言翻译成逻辑表达式时,你总是需要小心。另一个流行的例子是自然语言中的 "or" 主要对应于异或,而 "or" 运算符是包容性的。因此,如果有人告诉您 "you can take it or leave it",这意味着您必须做出决定,而标准逻辑 "or" 运算符实际上允许您同时执行这两项操作。