当前位置: 首页 > 知识库问答 >
问题:

为什么std::rand()的返回类型不是无符号int?

徐飞龙
2023-03-14

兰德说,

int rand()
返回介于​0​ 还有兰德·麦克斯(​0​ 包括兰德·马克斯)。

既然保证返回非负整数,为什么返回类型是有符号的?

我不是说我们是否应该在这里使用它。这是历史问题还是糟糕的设计?


共有1个答案

山煜祺
2023-03-14

关于未签名有很多争论。不考虑太多的主观区域,考虑以下事项:重要的不是从代码> RAND()返回的值< /代码>不能是否定的。重要的是,rand()返回一个特定类型的值,该类型决定了您可以使用该值做什么rand()从不返回负值,但对值应用使其为负值的操作有意义吗?当然可以。例如,你可能想做:

 auto x = rand() % 6 - 3;

如果rand()将返回一个无符号的,那么这将导致代码中看起来正常的错误。

例如,对索引使用无符号的是另一回事。索引总是正的。如果您想对其应用将值变为负值的操作,那么它就不再是索引了。另一方面,rand()%6-3是一个随机数,不管它是否正。

类型超出了它所能表示的值的范围。有符号整数和无符号整数有不同的语义。

请注意,C20引入了std::ssize。它的大小和容器一样,只能是正的。尽管如此,它还是有符号的。这是正值的一个例子,签名只是为了允许有符号的算术。此外,改变std::size来返回有符号的值也不是一个选项,因为这会破坏现有的代码。

顺便考虑一下,Java根本没有unsigend整数类型,因为无符号aritmeics被认为太令人困惑。

 类似资料:
  • 我读过这篇文章:java中arrays.aslist(array)与新arraylist (arrays.aslist(ia))之间的差异 当然,包装器上不允许一些列表操作,比如从列表中添加或删除元素,您只能读取或覆盖元素。 如果list2有List接口的引用,我期望它用Java实现List接口中包含的所有方法。https://docs.oracle.com/javase/7/docs/api/j

  • 为什么findElement(By)的返回类型是WebElement? 我知道文档中提到了返回类型是Webelment,但有人能解释一下为什么返回类型是Webelment吗。 我对这个话题的研究。 因为我们使用findElement搜索元素,webelement类用于表示HTML元素。 请让我知道我的想法是否正确或有任何具体原因

  • 问题内容: 由于在Java中使用了泛型,我最终不得不实现一个具有as返回类型的函数: 并且编译器要求我返回 一些东西 。现在我只是返回,但是我想知道这是否是好的编码实践… 我问的是 V oid,而不是 V oid。类, 而不是 保留关键字。 我也试过,,,,没有回报可言,但都不会在所有的工作。(出于或多或少明显的原因) 那么,如果函数的返回类型为,我应该返回什么呢? 该课程的一般用途是什么? 问题

  • 我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod

  • 我很好奇std::is_invocable_r的定义,以及它如何与不可移动类型交互。基于我对它应该模仿的语言规则的理解,它在C 20模式下的clang下的libc实现似乎是错误的,所以我想知道我的理解有什么不正确之处。 假设我们有一个不能移动或复制构造的类型,以及一个返回它的函数: 然后可以调用该函数来初始化对象(我认为是由于复制省略规则): 类型特征同意函数是可调用的,并返回: 但是,表示,调用

  • 但是,我想直接看到的缺点,所以我做了一个快速的实验: 基本上,我编写了两个函数和,它们分别使用和+生成0和5之间的随机数。 然后我用“老”的方式生成了960,000个(可被6整除)随机数,并记录了数字0-5的频率。然后我计算了这些频率的标准差。我所寻找的是一个尽可能低的标准偏差,因为如果分布是真正均匀的,那么就会发生这种情况。 我运行该模拟1000次,并记录每次模拟的标准偏差。我还记录了以毫秒为单