【问题标题】:String comparing to constant with if-else statement. Skipping second if/else使用 if-else 语句与常量进行比较的字符串。跳过第二个 if/else
【发布时间】:2015-03-13 05:41:12
【问题描述】:

我似乎遇到了问题。在尝试基于 A.M./P.M. 获取输入时。条目,我的 if else 语句有某种逻辑错误。我从来没有真正做过这种事情(我对 c++ 有点陌生),所以我们将不胜感激。

cout << "What time was the dose administered? (Round to hour): ";
cin >> time;
cout << "A.M./P.M.? ";
cin >> ap;

cout << ap;

if (ap == "A.M.", "am"){
    ap = "A.M.";
}
else if (ap == "P.M.", "pm"){
    ap = "P.M.";
}
else { cout << "This is not a valid entry.";
}

“ap”是一个字符串。 不管输入什么,结果都是“A.M.”

旁注:最初,它只会打印“P.M.”但是这两个语句最初都是“如果”,当我将其更改为“如果其他”时,它开始打印“A.M.”仅限。

【问题讨论】:

  • 您认为 (ap == "A.M.", "am") 会做什么?你认为 (ap, "P.M.", "pm") 会解决什么问题?
  • 你不能只是编造一些东西并期望它们能奏效。

标签: c++ string if-statement compare


【解决方案1】:

这...

ap == "A.M.", "am"

...rules of operator precedence下,相当于...

"am"

...在布尔上下文中经过标准转换为 true(通过非 0 指针)。

这是因为逗号运算符计算其左侧的子表达式 - 即 ap == "A.M." - 当该计算的任何副作用被执行时,子表达式的实际值随后被丢弃并且子表达式正确的 - 即"am" - 被评估和使用。

你应该改用:

if (ap == "A.M." || ap == "am")

(C++ 标准允许使用关键字“or”来替代||,但众所周知,微软的编译器在没有额外的命令行参数的情况下不支持它,因此在实践中最好避免使用可移植代码。 )

【讨论】:

  • Tony D 有写答案,我以前做过很多次,但我什至没有想到。谢谢你的回答,托尼 D!
  • @AceEbert:不用担心......很遗憾 C++ 不支持更简洁优雅的编写方式......干杯。
猜你喜欢
  • 2018-07-10
  • 2022-01-09
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2016-01-21
  • 1970-01-01
  • 2018-03-09
相关资源
最近更新 更多