20
|
Nordic Mainframe · 技术社区 · 14 年前 |
![]() |
1
8
是的,它会破坏语言/现有代码。正如您所指出的,当有符号操作数和无符号操作数一起使用时,语言会小心地指定行为。这种带有比较运算符的行为对于一些重要的习惯用法是必不可少的,例如:
更不用说(平等比较):
另外,为混合有符号/无符号比较指定“自然”行为也会导致显著的性能损失,即使在当前以安全方式使用此类比较的程序中,由于编译器难以确定(或MIGH)输入的限制,这些程序已经具有其“自然”行为。根本无法确定)。在编写自己的代码来处理这些测试时,我确信您已经看到了性能惩罚的样子,而且它并不漂亮。 |
![]() |
2
11
我只回答C。
C中没有可容纳所有可能整数类型的所有可能值的类型。离这最近的C99是
因此,不能实现数学值比较,例如
即使您将这种额外的复杂性添加到语言中(以及实现编写者的额外负担),它也不会有非常好的属性。例如,
我肯定有很多旧的Unix代码,可能在您的机器上运行,这是假设的
如果你想要lisp/haskell/python/$favorite_-language_和内置的_-bignums_,你知道在哪里找到它… |
![]() |
3
7
我不认为它会破坏语言,但是是的,它可能会破坏一些现有的代码(在编译器级别上很难检测到这种破坏)。 在C和C++中,有很多代码比你和我一起想象的(有些甚至可以被恐怖分子写)。
依靠“主张
目前的解决方案是警告这样的比较,并把解决方案留给程序员,我认为这是一个C和C++如何工作的精神。而且,在编译器级别上解决它会导致性能损失,这是C和C++程序员非常敏感的问题。对您来说,两个测试而不是一个可能是一个小问题,但在这可能是一个问题的地方,可能有很多C代码。它可以解决,例如,通过使用显式强制转换到公共数据类型来强制以前的行为——但这同样需要程序员的注意,因此,这并不比简单的警告更好。 |
![]() |
4
1
我认为C++就像罗马帝国一样。它太大了,太老套了,无法修复将要摧毁它的东西。 C++0X和Boost是一个可怕的可怕语法的例子——这种类型的婴儿只有父母能爱——而且与10年前的简单优雅(但严重受限)C++有很长的距离。 重点是,当一个人已经“固定”了一些非常简单的东西作为比较类型的积分,足够的遗产和现有的C++代码已经被打破,人们不妨称之为一种新的语言。 一旦破裂,还有很多其他的问题也可以追溯修复。 |
![]() |
5
0
一种语言定义规则的唯一方法是,在使用不同C语言类型的操作数组合时,使编译器至少在某些上下文中禁止隐式类型转换(将“惊喜”转换为“为什么不编译?”并且使其不太可能在路上引起意外的错误),为每个存储格式定义多个类型(例如每个整数类型的包装和非包装变量),或者两者都定义。
对于每种存储格式都有多种类型,例如有符号和无符号16位整数的包装和非包装版本,编译器可以区分“我在这里使用的是16位值,以防它提高效率,但它永远不会超过0-65535的范围。”
如果发生了什么我也不会在意
)“我使用的是16位值,需要换行到65535,它将变为负数。”在后一种情况下,对于这样的值使用32位寄存器的编译器必须在每次算术运算后对其进行屏蔽,但在前一种情况下,编译器可以忽略这一点。关于您的特殊愿望,非包装签名长与
非包装
无符号长整型将是清晰的,编译器可以生成实现它所需的多指令序列(因为负数转换为不换行
不幸的是,除了让编译器为混合操作数比较生成警告之外,我真的看不到用C语言可以做多少事情,因为它的存在不需要像上面所描述的那样向它添加新类型;尽管我认为添加这些新类型是一种改进,但我不会屏息以待。 |
![]() |
6
0
如果整数类型之间的比较比较比较了实际的数学值,我希望整数和浮点之间的比较也一样。比较任意64位整数和任意双精度浮点数的精确值是非常困难的。但是编译器可能比我更擅长它。 |
![]() |
ridiculous_fish · std::是否保证短路? 2 年前 |
![]() |
Hilde Schneider · php对我的if条件有问题 7 年前 |
![]() |
user8188120 · 熊猫用np标记时间戳。其中比较 7 年前 |
|
Jarek · 与循环python数据帧中的下一个/上一个值进行比较 7 年前 |
|
vato · Bash脚本:测试浮点数是否在包括负数在内的特定范围内 7 年前 |