考虑C中的以下循环:
int i;
for (i = 1; i > 0; i++);
i
到达INT_MAX
后,它会以INT_MIN
递增。然后i > 0
进行评估
false,for循环将终止。
但是,相同的for循环不会在Arduino中终止,因为i > 0
比较为false
即使i
是-32768
。
为什么?
PS。我使用的是Mega 2560和Arduino版本1.0.5 PPS。在Mega 2560上,int确实是16位 购买力平价。完整的草图如下:
void setup () {
int i;
Serial.begin(9600);
for (i = 1; i > 0; i++);
}
void loop () {
Serial.println(100);
}
我在串行监视器中看不到任何东西
答案 0 :(得分:1)
反汇编设置功能给出:
0000014a <setup>:
14a: 80 e3 ldi r24, 0x30 ; 48
14c: 94 e0 ldi r25, 0x04 ; 4
14e: 40 e8 ldi r20, 0x80 ; 128
150: 55 e2 ldi r21, 0x25 ; 37
152: 60 e0 ldi r22, 0x00 ; 0
154: 70 e0 ldi r23, 0x00 ; 0
156: 42 d2 rcall .+1156 ; 0x5dc <_ZN14HardwareSerial5beginEm>
158: ff cf rjmp .-2 ; 0x158 <setup+0xe>
所以现在很清楚:avr-gcc认为i > 0
中的for(i = 1; i > 0; i++)
永远不会评估false并优化退出条件。
答案 1 :(得分:0)
最有可能的,&#39; int&#39;在Arduino上也是32位。完成2 ^ 31次迭代需要时间。你可以改变&#39; int&#39;短暂的&#39;它应该按预期终止。
答案 2 :(得分:0)
当定义int时,默认情况下,编译器假定其大小为16位。
但是当你增加它超过32767,即
int i=32767;
i++;
&#39; i&#39;的大小自动增加到32位。这是因为声明中未指定大小。
这会导致您的程序停止在32767。
因此,如果你想在32767停止for循环,
您必须明确声明为
short int i;
如果您想验证这一点,可以尝试按照
short int x;
for(x=1; x>0; x++)
{
mySerial.println(x);
}
和
int x;
for(x=1; x>0; x++)
{
mySerial.println(x);
}