繁体   English   中英

C / C ++使用int或unsigned int

[英]C/C++ use of int or 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的整数)。

我选择在编程时尽可能明确。 也就是说,如果我打算使用其值始终为正的变量,则使用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);

在上面的例子中,如果将负值作为thing_ID传入会发生什么? 在第一种情况下,您会发现负值不大于或等于 NUM_THINGS ,因此该函数将继续执行。

在第二种情况下,您实际上会在运行时捕获它,因为thing_ID的thing_ID强制条件执行无符号比较

当然,您可以执行类似other_safe_function ,但这似乎更像是使用有符号整数而不是更明确并使用无符号开头的other_safe_function

如果length也是int ,那么你应该使用相同的整数类型,否则在比较语句中混合有符号和无符号类型时会发生奇怪的事情。 大多数编译器会给你一个警告。

你可以继续问,为什么length要签名? 嗯,这可能是历史性的。

此外,如果您决定反转循环,即

for(int i=length-1;i>=0 ;i--)
{
   // do stuff
}

如果使用无符号整数,则逻辑会中断。

我认为最重要的原因是如果你选择unsigned int ,你会得到一些逻辑错误。 实际上,您通常不需要unsigned int的范围,使用int更安全。

这个微小的代码是与用例相关的,如果你调用一些vector元素,那么原型就是int,但是有很多现代的方法可以用c ++来实现它。 对于(const auto&v:vec){}或迭代器,在某些计算中,如果没有减去/达到负数,你可以并且应该使用unsigned(更好地解释预期值的范围),有时这里有很多贴出的例子显示你实际上需要int但事实是所有关于用例和情况,没有一个严格的规则适用于所有用例,并且强迫一个人愚蠢...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM