【问题标题】:'a' == 'b'. It's a good way to do?'a' == 'b'。这是一个好方法吗?
【发布时间】:2011-11-30 18:06:18
【问题描述】:

如果我以这种方式比较两个字符会发生什么:

if ('a' == 'b')
    doSomething();

我真的很想知道当语言(和编译器)找到这样的比较时会做什么。当然,如果这是做某事的正确方法,或者我必须使用strcmp()之类的东西。

编辑 等等等等。
由于有人不明白我的真正意思,我决定换一种方式解释。

char x, y;
cout << "Put a character: ";
cin >> x;
cout << "Put another character: ";
cin >> y;

if (x == y)
    doSomething();

当然,在if 括号中,您可以将== 替换为任何其他比较运算符。
我真正想知道的是:如何在 C/C++ 中考虑角色?当编译器比较两个字符时,它怎么知道 'a' 和 'b' 不同呢?是指ASCII表吗?

【问题讨论】:

  • 优化编译器会意识到这永远不可能,并消除整个语句。
  • @MarcB 我怀疑这可能是一个使用“魔术”字符而不是变量的抽象简化示例。
  • 我认为您实际上并不是在询问“a”与“b”的具体比较,因为这显然总是返回 False,而是询问比较单个字符。如果是这样,请编辑您的问题以明确说明。
  • @MarcB 我怀疑这个问题是关于抽象案例的,你的评论针对他的具体例子。
  • 也许 OP 是一个正在恢复的 Java 程序员,并且期望像 (new Char('a')).equals(new Char('b')) 这样的方法是正确的方法(或者可能是涉及包装器工厂的更复杂的方法)。

标签: c++ c comparison char


【解决方案1】:

您可以通过比较运算符== 绝对安全地比较基本类型

【讨论】:

  • 另外,应该指出'a'和'b'不是字符串,它们是字符(原语)。如果是 "a" == "b" 那就另当别论了。
  • 您对基本类型几乎是正确的,除了浮点数/双精度数。我想你明白了,if ( doubleValue == 3.14 ) 在很多情况下都不正确
  • @borisbn,你不完全正确。 floats/doubles 是相等的,如果它们的值也是二进制相等的。在您的示例中,问题可能是由于舍入错误而不是 == 故障而发生的。请注意,即使在这种情况下,运营商 == 也能正常工作。
  • @triclosan 计算机始终完全按照您的写作方式行事,但有时what did you write != what did you want to say to do ))
【解决方案2】:

在 C 和 C++ 中,单字符常量(和 char 变量)是整数值(在数学意义上,而不是在 int 值的意义上)。当您使用== 时,编译器会将它们作为整数进行比较。您还可以使用其他整数比较运算符(&lt;&lt;= 等)。您还可以对它们进行加减运算。 (例如,将数字字符转换为其数值的常用习语是c - '0'。)

【讨论】:

    【解决方案3】:

    对于单个chars,这种形式是正确的。如果两个操作数在您的示例中在编译时都是已知的,那么可以(并且几乎肯定会)在编译时评估条件并且不会产生任何代码。

    请注意,char ('a') 与单字符串 ("a") 不同。对于后者,比较有不同的含义:它会比较指针而不是字符。

    【讨论】:

      【解决方案4】:

      您的处理器将减去两个操作数,如果为零,则设置零条件位,您的值是相同的。

      例如:在 arm 机器上,您有 nzcv(负、零、进位、溢出)位,这些位告诉您发生了什么。

      【讨论】:

      • 这可能不相关。可以实现不具有这些属性的机器,因此除非提问者明确说明他正在开发的平台,否则说这些是既定事实是不准确的。 (在 x86 和 ARM 的情况下,你是对的,但我可以很容易地设计出一个不适用的指令集。)
      • 大多数情况下你有一个状态寄存器和一个数学运算。在我的示例中,它是减法,据我所知,大多数处理器都使用这种做法,可以将此高级代码转换为他自己的 asm 指令。我想说的是,在比较的情况下,您有 2 个寄存器,其中有一个值,您可以通过数学运算对其进行比较。问题是“它怎么知道 'a' 与 'b' 不同?”抱歉,如果我理解了其他内容
      • 问题是 C++ 如何处理'a' == 'b',而不是机器如何处理它。在这方面,机器的行为是不相关的。
      【解决方案5】:

      因为a 不等于b,所以什么都不会发生。

      如果你的问题只是正确的方法,那么答案是肯定的。

      【讨论】:

        【解决方案6】:

        首先 'a' 和 'b' 不是字符串,它们是字符。细微差别很重要,因为它的含义。

        您可以将字符与字符进行比较,就像将整数与整数以及浮点数与浮点数进行比较一样。通常不会这样做,因为结果总是一样的。即'a' == 'b' 将始终为假。

        但是,如果您要比较字符串,则必须使用 strcmp() 之类的内容。

        【讨论】:

          【解决方案7】:

          编译器只需插入一条指令来比较两个字节是否相等——这是一个非常有效的操作。当然,在您的情况下,'a'=='b' 等效于常量 false

          【讨论】:

            【解决方案8】:

            编译器将比较数字 ASCII 代码。所以,“a”永远不等于“b”。但, 'a' &lt; 'b' 计算结果为真,因为在 ASCII 表中,“a”出现在“b”之前。

            【讨论】:

            • 假设使用了 ASCII 编码
            【解决方案9】:

            当然,你想使用像这样的变量

            char myChr = 'a' ;
            if( myChr == 'b' ) puts( "It's b" ) ;
            

            现在你可以开始考虑"Yoda conditions",你会在哪里做

            if( 'b' == myChr )  puts( "It's a b" ) ;
            

            这样万一你在第二个例子中不小心输入了等号:

            if( 'b' = myChr ) puts( "It's a b" ) ;
            

            这会引发编译器错误

            【讨论】:

            • 这只会让代码更难看,任何体面的编译器都会给你一个if (x=5)的警告。
            • 嗯。我想这有点虚伪,因为我自己不使用尤达条件。尽管如此,还是有人喜欢它们。
            猜你喜欢
            • 1970-01-01
            • 2013-11-05
            • 2012-08-21
            • 2012-07-20
            • 1970-01-01
            • 2011-06-13
            • 2010-12-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多