代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

unicode字符与非unicode字符比较,但没有警告或错误

  •  1
  • Brian R. Bondy  · 技术社区  · 16 年前

    std::wstring str = L"hi";
    if(str[0] == 'h')
          cout<<"strange"<<endl;
    

    正确的正常代码为:

    std::wstring str = L"hi";
    if(str[0] == L'h')
          cout<<"strange"<<endl;
    

    编译器:VisualStudio2005

    3 回复  |  直到 16 年前
        1
  •  7
  •   Stack Overflow is garbage    16 年前

    它不会给出警告,因为比较是有效的。通常,您总是可以比较整数类型,它们只是根据需要升级为更广泛的类型。

    我敢肯定有些编译器会对此发出警告。你用哪一种?(在任何情况下,警告都是特定于编译器的,它们不需要对此或任何其他内容发出警告)

        2
  •  2
  •   ChrisW    16 年前

    难道不是因为C++允许隐式转换吗?例如,以下内容是否也合法:

    if (str[0] == 104) //C++ allows various implicit type conversions
    

    ... 也没有关于隐式转换的任何类型的警告?

    这个问题是特定于编译器的:您使用哪个编译器?可能有一个编译器选项会影响您从编译器获得的警告类型。

        3
  •  0
  •   MSalters    16 年前

    很难说编译器为什么不给出警告。他们可以出于任何原因这样做,并且应该在代码可疑时这样做。不过,由于代码在技术上是正确的,因此错误可能会放错位置。

    wchar_t 和一个ISO-8859-1字符。Unicode子集U+0000到U+00FF等于ISO 8859-1字符0-FF。因此,每个字符与其对应的wchar\u t具有相同的数值。因此 wchar_t('a')==L'a' .