【问题标题】:Char equals char undesired output [duplicate]Char等于char不需要的输出[重复]
【发布时间】:2019-04-02 13:51:39
【问题描述】:

我正在尝试创建一个简单的 c++ 程序,它会打印出 char 是 Y 还是 y、N 还是 n 或两者都不是。

经过调试,我发现 if(chr == 'Y' || 'y') 语句是正确的,即使 char 变量是 'N'。谁能告诉我为什么这个 if 语句是真的而不是假的?

#include "pch.h"
#include <iostream>
using namespace std;

void main()
{
char chr = 'N';

if (chr == 'Y' || 'y')
{
    cout << "chr is y" << endl;

}
else if (chr == 'N' || 'n')
{
    cout << "chr is n" << endl;
}
else
{
    cout << "chr is something else" << endl;
}
}

【问题讨论】:

  • 这并不像你认为的那样。请改用 chr == 'Y' || chr == 'y''n''N' 类似)。
  • 条件chr == 'Y' || 'y' 表示“chr 等于'Y';或'y'。”注意句子第二部分没有比较。你的句子应该是“chr is equal to 'Y'; Or chr is equal to 'y'。”
  • 另请参阅std::toupperstd::tolower,因此您只需进行一次比较。

标签: c++ if-statement char equals


【解决方案1】:

不是这个

if (chr == 'Y' || 'y')

你需要

if ((chr == 'Y') || (chr == 'Y'))

'N''n' 也是如此。

也可以通过一个比较来做到这一点:

if (toupper((unsigned char)chr) == 'Y')

这样,可维护性略有提高,因为如果字母发生变化,只需更改一个值(例如,对于不同的本地化)。

【讨论】:

  • 也可以使用if (toupper(chr) == 'Y') 而不必处理附加检查。 :-)
  • 好建议,我已将其添加到帖子中。
  • @ThomasMatthews 它shouldtoupper((unsigned char)chr)。 :)
  • @HolyBlackCat:编译器会负责提升,因此不需要强制转换。
  • @ThomasMatthews 缺少演员表 -> UB 如果传递的字符有负码(不等于 EOF),如链接所示。
【解决方案2】:

这不是你做的事:

if (chr == 'Y' || 'y')

这基本上是:

if (chr == 'Y' || true)

所以最后:

if (true)

你必须说出你的比较:

if (chr == 'Y' || chr == 'y')

运算符== 只接受一个字符,而不是一组可能的字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2012-05-23
    • 2018-03-27
    相关资源
    最近更新 更多