Jaa*_*nus 4 c optimization unsigned-integer
考虑这个C代码:
#include "stdio.h"
int main(void) {
int count = 5;
unsigned int i;
for (i = count; i > -1; i--) {
printf("%d\n", i);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的观察/问题:循环永远不会被执行.但是,如果我将i的数据类型从unsigned int更改为int,则一切都按预期工作.
我一直在考虑使用无符号整数作为当你试图从它们中减去时"环绕"的值.因此,当i为零并且我减去1时,它将回绕到UINT_MAX.而且由于它的价值永远不会消极,这实际上是一个无限循环.(当我将比较从i> -1更改为i> = 0时,这正是发生的情况.)
在我的逻辑中某处有一个错误,因为如果我是无符号的,循环永远不会执行,我将它与-1进行比较.编译器要么以某种方式优化它,要么运行时值的行为与我期望的不同.
为什么循环不能运行?
Ste*_*sop 18
在i > -1,转换为-1 unsigned int,得到值UINT_MAX.i永远不会大于该值,因此循环体永远不会执行.
您可能会发现您可以说服编译器警告您:在条件上下文中使用always-true或always-false表达式.但如果你写了i > -2,那对你仍然没有帮助,所以你也可能发现你可以为所有的混合符号比较启用警告.
请注意,在C中,始终使用相同类型的操作数执行算术运算.这包括比较,但IIRC不是班次运营商.如果操作数是不同类型的,如在这种情况下,则转换它们中的至少一个以使它们成为相同的类型.计算出目的地类型的规则见6.3.1.1/2和6.3.1.8/1.
| 归档时间: |
|
| 查看次数: |
2868 次 |
| 最近记录: |