在Visual Studio中,为什么要将字符(以前是char,现在是wchar_t)的值与值-1进行比较?
我有一个对-1进行多次无效检查的项目:
TCHAR ch;
...
if(ch==-1)
Coverity告诉我"" ch == -1"无论其操作数的值如何,它总是为假。"
现在,这最初编写为使用char值而不是wchar_t,并在需要unicode支持时进行了升级。我需要找出为什么" char ch;"正在检查-1,以便我可以对wchar_t进行类似的检查。
答案 0 :(得分:1)
整数常量EOF
通常#defined到-1
。如果这是您的代码正在检查的内容(取决于ch
的来源),那么相应的wchar_t
比较将是WEOF
,并且相应的Windows TCHAR宏似乎是{ {3}}
PS:正如评论中正确指出的那样,如果某个值已转换为char
或wchar_t
,则将其与EOF
或{{1}进行比较为时已晚}:大量编码使用char WEOF
作为有效字母,并且在转换后与EOF无法区分。代码完全错误:变量'\xff'
需要具有ch
/ int
/ wint_t
类型才能使此类比较有效。
答案 1 :(得分:0)
大多数情况下,-1
/ 255
与EOF
答案 2 :(得分:0)
TCHAR
的类型是什么?如果它真的是无符号类型
小于int
,表达式永远不会是真的,因为
整体推广将会发生,从而产生很大的积极影响
整数,但仍然小于UINT_MAX
,其中-1
是UINT_MAX
。 (如果TCHAR
类似unsigned short
,
例如,它通常可以具有该范围内的值
0 ... 65365,将转换为int
或unsigned int
没有改变价值。 -1,另一方面,将
通常在转换为时转换为类似4294967295的内容
无符号的。)
如果您正在检查文件结尾(例如,在
std::iwstream.get()
),然后你应该之前
转换int
的结果。即使使用char
,它也没有
工作;如果普通char
是无符号的,那么它永远不会是-1,并且
如果签名,那么一个有效字符(ISO 8859-1中的ÿ
)
将显示为文件结尾。