【问题标题】:What does it mean when a char or wchar_t == -1?char 或 wchar_t == -1 是什么意思?
【发布时间】:2014-04-21 20:10:42
【问题描述】:

在 Visual Studio 中,为什么要将字符(以前是 char,现在是 wchar_t)的值与 -1 的值进行比较?

我有一个项目对 -1 进行了多次无效检查:

TCHAR ch;
...
if(ch==-1)

Coverity 告诉我“ch == -1”总是假的,不管其操作数的值如何。”

现在,它最初是为使用 char 值而不是 wchar_t 而编写的,并在需要 unicode 支持时进行了升级。我需要弄清楚为什么“char ch;”正在针对 -1 进行检查,以便我可以针对 wchar_t 进行类似的检查。

【问题讨论】:

  • 表示文件结束(EOF)。
  • 通常表示 EOF 或某种错误。使用您从中获取价值的位置更新您的代码,这将使我们能够更好地帮助您。

标签: c++ visual-studio-2012


【解决方案1】:

整数常量EOF 通常是#defined 到-1。如果这是您的代码正在检查的内容(取决于ch 的来源),那么对应的wchar_t 比较将是WEOF,并且适当的Windows TCHAR 宏似乎是_TEOF

PS:正如在 cmets 中绝对正确指出的那样,如果将一个值转换为 charwchar_t,那么将其与 EOFWEOF 进行比较为时已晚:大量编码使用 char '\xff' 是一个有效的字母,并且在这种转换后变得与 EOF 无法区分。代码完全是错误的:变量ch 需要具有int/wint_t/_TINT 类型才能使任何此类比较有效。

【讨论】:

  • 有趣。当前代码实际上是同时检查 -1 和 EOF: if(ch==-1 || ch == (TCHAR)EOF)
  • 我认为这个答案是错误的;它当然是根据 C++ 标准。 (但众所周知,Microsoft 以非常非标准的方式做事。)您无法将wchar_tWEOF 进行比较,就像将charEOF 进行比较一样。与WEOF 进行比较时,您需要使用wint_t(引用的链接表明_TEOF 的计算结果为EOFWEOF,因此无法与TCHAR 进行比较。)
  • @JamesKanze 您对wint_t 的看法完全正确!当我用“整数常量 EOF”打开时,我会提到,但不得不缩短。
【解决方案2】:

大多数时候,-1/255EOF 相关联

【讨论】:

  • 标准要求EOF为负数,所以永远不可能是255。
【解决方案3】:

TCHAR 的类型是什么?如果它真的是无符号类型 小于int,表达式永远不会为真,因为 会发生积分提升,产生大的正向 整数,但仍小于UINT_MAX,其中-1UINT_MAX。 (如果TCHAR 类似于unsigned short, 例如,它通常可以具有范围内的值 0...65365,将转换为 intunsigned int 在不改变值的情况下。 -1,另一方面,将 通常转换为 4294967295 时转换为 未签名。)

如果您正在检查文件结尾(例如,在 std::iwstream.get()),那么你应该这样做之前int 转换结果。即使使用char,它也不会 工作;如果普通的char 是无符号的,那么它永远不会是-1,并且 如果已签名,则为一个有效字符(ISO 8859-1 中的ÿ) 将显示为文件结尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多