当char或wchar_t==-1时,它意味着什么
What does it mean when a char or wchar_t == -1?
在Visual Studio中,为什么要将字符(以前是char,现在是wchar_t)的值与-1的值进行比较?
我有一个项目有多个无效的检查-1:
TCHAR ch;
...
if(ch==-1)
Coverity告诉我,"ch==-1"无论其操作数的值如何,都总是错误的。"
现在,它最初是为了使用char值而不是wchar_t编写的,并且在需要unicode支持时进行了升级。我需要弄清楚为什么要对照-1检查"char ch;",这样我就可以对照wchar_t进行类似的检查。
整数常数EOF
通常被#定义为-1
。如果这是您的代码正在检查的内容(取决于ch
来自哪里),那么相应的wchar_t
比较将是WEOF
,并且相应的Windows TCHAR宏似乎是_TEOF。
PS:正如评论中绝对正确地指出的那样,如果一个值被转换为char
或wchar_t
,那么将其与EOF
或WEOF
进行比较就太晚了:许多编码使用字符'xff'
作为有效字母,在这种转换后,这与EOF无法区分。代码完全错误:变量ch
需要具有类型int
/wint_t
/_TINT
,这样的比较才会有效。
大多数情况下,-1
/255
与EOF
关联
TCHAR
的类型是什么?如果它真的是一个无符号类型小于int
,则该表达式永远不可能为真,因为将进行整体提升,从而产生巨大的积极影响整数,但仍小于UINT_MAX
,其中为-1
是CCD_ 22。(如果CCD_ 23类似于CCD_,例如,它通常可以具有范围内的值0…65365,将转换为int
或unsigned int
而不改变值-1,另一方面,将通常转换为4294967295未签名。)
如果您正在检查文件结尾(例如std::iwstream.get()
),那么您应该在转换来自CCD_ 28的结果。即使使用char
工作如果普通char
是无符号的,那么它永远不可能是-1,并且如果已签名,则为一个有效字符(ISO 8859-1中的ÿ
)将显示为文件结尾。
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 当索引为 1 时,_BitScanReverse返回 0,这意味着根据 MS "no set bits were found"
- 当我们在 C++ 中说"initialize the object"时,它实际上意味着什么?
- 在C 中,当使用两次时,这意味着什么
- 编译器优化合并了相同的函数实现,这意味着在运行时要绕过存根
- 当我们在模板声明中看到类 C = myarray 时,这意味着什么?
- 当我的应用程序无法在调试模式下运行,但 exe 文件可以完美运行时,这意味着什么?
- 嗨,我只是想知道这个错误意味着什么.当我尝试构建时,
- 当 matlab 找不到语言环境数据库时,这意味着什么?
- 当构造函数的输入参数设置为等于 C++ 中的值时,这意味着什么?
- 当一个人说某事对 SFINAE 友好时,这意味着什么?
- 当 Boost.Exception 符号出现在'nm'输出中时,这意味着什么?它们会导致违反 ODR 吗?
- 当与指针进行比较时,行使所有可能的控制路径意味着什么
- 当bad_alloc没有抛出时,“new”没有抛出保证意味着什么
- 当一个参数在函数原型中被赋值时,这意味着什么
- 当cv::minMaxLoc返回点(-1,-1)作为最小和最大位置时,这意味着什么?
- 当一个类声明似乎有两个名称时,这意味着什么?
- 当我编译程序时,这个内存映射意味着什么?
- 当使用dumpbin查看c++库信息时,UNDEF和notype()意味着什么?