dev*_*bmw 28 c c++ int unsigned types
在很多代码示例,源代码,库等中.我看到使用int时,就我所知,unsigned int更有意义.
我看到很多的地方是for循环.见下面的例子:
for(int i = 0; i < length; i++)
{
// Do Stuff
}
Run Code Online (Sandbox Code Playgroud)
为什么你会使用一个int而不是一个unsigned int?这只是懒惰 - 人们不会打字打扰unsigned吗?
Pau*_*kin 22
使用unsigned可能会引入难以发现的编程错误,通常最好使用signed int来避免它们.一个例子是当你决定向后迭代而不是向前迭代并写下这个:
for (unsigned i = 5; i >= 0; i--) {
printf("%d\n", i);
}
Run Code Online (Sandbox Code Playgroud)
另一个是如果你在循环中做一些数学:
for (unsigned i = 0; i < 10; i++) {
for (unsigned j = 0; j < 10; j++) {
if (i - j >= 4) printf("%d %d\n", i, j);
}
}
Run Code Online (Sandbox Code Playgroud)
使用unsigned引入了这些类型的错误的潜力,并没有任何好处.
use*_*003 10
这通常是懒惰或缺乏理解.
当值不应为负数时,我会使用unsigned int.这也用于指定正确值应该是什么的文档目的.
恕我直言,断言使用"int"比使用"unsigned int"更安全是完全错误的并且是一种糟糕的编程习惯.
如果您使用过Ada或Pascal,您将习惯于使用更安全的方法来指定值的特定范围(例如,一个只能是1,2,3,4,5的整数).
我选择在编程时尽可能明确。也就是说,如果我打算使用其值始终为正的变量,则unsigned可以使用。这里有许多提到“难以发现的错误”,但是很少给出示例。考虑下面的倡导者示例使用unsigned,与这里的大多数帖子不同:
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);
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,如果将负值作为传入会发生什么thing_ID?在第一种情况下,您会发现负值不大于或等于 NUM_THINGS,因此该函数将继续执行。
在第二种情况下,您实际上会在运行时捕获到这一点,因为force的thing_ID有符号性会强制条件代码执行无符号比较。
当然,您可以做类似的事情other_safe_function,但这似乎更倾向于使用带符号的整数,而不是更明确地使用无符号的整数。