在我用我的项目,该项目的源文件,还有的比较ssize_t
并size_t
变量:
ssize_t sst;
size_t st;
if(sst == st){...}
我想摆脱的警告:
warning: comparison between signed and unsigned integer expressions
但我不知道,我应该投给其他哪个变量?
if((size_t)sst == st){...}
要么
if(sst == (ssize_t)st){...}
什么是更安全,更好,更清洁? 谢谢
有没有一个正确的回答这个问题。 有几种可能的答案,取决于你知道什么是关于这些变量可以采取的值先验 。
如果你知道sst
非负,那么你可以放心地投sst
到size_t
,因为这不会改变的值(顺便说一句,这是如果你没有投在所有发生的事情)。
如果sst
可能是负面的,但你知道, st
永远不会大于SSIZE_MAX
,那么你可以放心地投st
至ssize_t
,因为这不会改变价值。
如果sst
可能是负数, st
可能会大于SSIZE_MAX
,然后也不要把正确; 任一个可以改变值,从而导致不正确的比较。 相反,你会做以下if (sst >= 0 && (size_t)sst == st)
如果你不完全肯定的前两种情况之一者,选择第三个选项,因为它是在所有情况下是正确的。
只要这两个值适合的正面描述范围要么将正常工作ssize_t
。
如果任一值不 ,你可能由此陷入困境结束了-测试相等之前检查这些情况:
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}
(我敢肯定,C ++的人会建议你避免C风格完全投 - 我毫无疑问会有人发表评论或回答,让你知道该怎么做,在C ++正道)