C / C ++使用int或unsigned int
在很多代码示例,源代码,库等中我看到使用int时,就我所知,unsigned int会更有意义。
我看到的一个地方很多是for
循环。 见下面的例子:
for(int i = 0; i < length; i++) { // Do Stuff }
为什么你会使用int而不是unsigned int? 这只是懒惰吗 – 人们不会因打字unsigned
而烦恼吗?
使用unsigned
可能会引入难以发现的编程错误,并且通常最好使用signed int
来避免它们。 一个例子是当你决定向后迭代而不是向前迭代并写下这个:
for (unsigned i = 5; i >= 0; i--) { printf("%d\n", i); }
另一个是如果你在循环中做一些数学:
for (unsigned i = 0; i < 10; i++) { for (unsigned j = 0; j < 10; j++) { if (i - j >= 4) printf("%d %d\n", i, j); } }
使用unsigned
引入这些类型的错误,并且没有任何好处。
这通常是懒惰或缺乏理解。
当值不应为负数时,我会使用unsigned int。 这也用于指定正确值应该是什么的文档目的。
恕我直言,断言使用“int”比使用“unsigned int”更安全是完全错误的,也是一种糟糕的编程习惯。
如果您使用过Ada或Pascal,您将习惯于使用更安全的方法来指定值的特定范围(例如,一个只能是1,2,3,4,5的整数)。
如果length
也是int
,那么你应该使用相同的整数类型,否则在比较语句中混合有符号和无符号类型时会发生奇怪的事情。 大多数编译器会给你一个警告。
你可以继续问,为什么要签署length
? 嗯,这可能是历史性的。
此外,如果您决定反转循环,即
for(int i=length-1;i>=0 ;i--) { // do stuff }
如果使用无符号整数,则逻辑会中断。
我认为最重要的原因是如果你选择unsigned int
,你会得到一些逻辑错误。 实际上,您通常不需要unsigned int
的范围,使用int
更安全。
我选择在编程时尽可能明确。 也就是说,如果我打算使用其值始终为正的变量,则使用unsigned
。 许多人在这里提到“很难发现错误”但很少举例。 考虑以下使用unsigned
主张示例,与此处的大多数post不同:
enum num_things { THINGA = 0, THINGB, THINGC, NUM_THINGS }; int unsafe_function(int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int safe_function(unsigned int thing_ID){ if(thing_ID >= NUM_THINGS) return -1; ... } int other_safe_function(int thing_ID){ if((thing_ID >=0 ) && (thing_ID >= NUM_THINGS)) return -1; ... } /* Error not caught */ unsafe_function(-1); /* Error is caught */ safe_function((unsigned int)-1);
在上面的例子中,如果将负值作为thing_ID
传入会发生什么? 在第一种情况下,您会发现负值不大于或等于 NUM_THINGS
,因此该函数将继续执行。
在第二种情况下,您实际上会在运行时捕获它,因为thing_ID的thing_ID
强制条件执行无符号比较 。
当然,你可以做类似other_safe_function
事情,但这似乎更像是使用有符号整数而不是更明确并使用无符号开头的other_safe_function
。
只有当length大于max int值时才使用unsigned int。 使用unsigned int可能会引入难以发现的错误,尤其是在长度可变的情况下。