在 C++ 中比较时有些奇怪

Posted

技术标签:

【中文标题】在 C++ 中比较时有些奇怪【英文标题】:something weird when compare in c++ 【发布时间】:2022-01-03 00:07:11 【问题描述】:

首先,对不起大家,因为我的英语不好。我有一个简单的代码:

#include <iostream>
using namespace std;
int main(void) 
    char ch = '1';  
    if (ch == (char)1) 
        cout << "Yes";
    
    else 
        cout << "No";
    
    system("pause");

奇怪的是控制台打印号。为什么不相等?

【问题讨论】:

(char) 1 不等于 '1' 字符文字'1'的数值为49。en.cppreference.com/w/cpp/language/ascii @RetiredNinja 它的值可能是49。 ASCII 不是 C++ 中唯一允许的编码 因为它们不是。从技术上讲,这是 C++ 实现的运行时字符集的一个特征,但是没有一个广泛使用的字符集将十进制数字字符编码为等于它们所代表的数字值的代码。这对于 '0' 来说尤其成问题,其数字编码为 0 会使其成为字符串终止符。 另一方面,'1' - '0' 是 1。这就是您将数字字符转换为数字所代表的值的方式。 【参考方案1】:

ch 包含字符'1' 的字符代码。假设ASCII编码,这个代码的值为49。这个不等于1,所以条件为假。

将值 1 转换为 char 不会将其转换为字符编码。

要使条件为真,需要使用字符常量进行比较。

if (ch == '1') 

【讨论】:

【参考方案2】:

那是因为 (char)1 不是“1”而是代表“标题的开始”。因此你的输出变成了否。

【讨论】:

我认为这条评论可以解释“标题开头”的确切含义。【参考方案3】:

(char) 1 将 1 从十进制转换为 ascii 代码 1 等于 [开始标题] 您可以转换为 49 的 '1' ascii 代码。

【讨论】:

以上是关于在 C++ 中比较时有些奇怪的主要内容,如果未能解决你的问题,请参考以下文章

比较 c#、c++ 和 java 的性能(c# 的奇怪行为)

当我尝试在 OpenCV IOS 中归因变量时发生奇怪的崩溃

python中的关于is的奇怪现象

如何在 C++ 中使用 sdl、opengl 移动相机时修复奇怪的相机旋转

运行时 Visual C++ 10 中的奇怪异常

C++ ostringstream 奇怪的行为