如果我有一个int和一个size_t变量,我可以比较它们:
int i=1;
size_t y=2;
if(i==y)
// do something..
或者我必须输入其中一个?
答案 0 :(得分:55)
如果int
为零或正数,则安全。如果它是否定的,并且size_t
的排名等于或高于int
,则int
将转换为size_t
,因此其负值将变为正值。然后将这个新的正值与size_t
值进行比较,这可能(以惊人的不可能的重合)给出误报。要真正安全(并且可能过于谨慎),请先检查int
是非负的:
/* given int i; size_t s; */
if (i>=0 && i == s)
并禁止编译器警告:
if (i>=0 && (size_t)i == s)
答案 1 :(得分:0)
size_t
将是某种整数类型(尽管可能是无符号的,因此它可能会生成警告),因此应该自动为您完成相应的转换。
正如其他人已经说过的那样,您可能想要重新审视产生int
的任何计算,如果您正在计算所需的大小,请首先查看是否可以在size_t
中执行此操作东西。
答案 2 :(得分:0)
可以将size_t
值与int
值进行比较,int
值将隐式转换为unsigned
类型。
当您在比较中混合使用signed
和unsigned
类型时,某些编译器会发出警告。在这种情况下,您可以明确地将signed
值转换为适当的unsigned
类型以禁止警告。
答案 3 :(得分:0)
如果您要将int类型与size_t(或任何其他库类型)进行比较,则由于进行了比较,因为int是带符号的,而size_t是无符号的,因此您将进行危险的比较,因此将根据您的编译器隐式转换其中之一/平台。最好的办法是将您的int i重写为:
decltype(y.size())i = 1;
这会将您的i分配为您要比较的安全类型,我认为这是一种好习惯。该解决方案在所有类型的迭代器中也很有用。通常,您不希望信任编译器为您强制转换,但是这样做有风险,而且有不必要的风险。