下面程序输出是什么
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
int
main()
{
bool
first=
true
;
int
sum=0;
int
value;
unsigned
short
i=0xFFFF;
for
(;i>=0;--i)
{
if
(first)
{
value=65536;
sum+=value%3;
first=
false
;
}
else
{
sum+=--value%3;
if
(value<=0)
{
cout<<sum<<
","
<<i;
break
;
}
}
}
return
0;
}
解析:
True只经历一次, i=65535,sum=1,value=65536,
False第一次循环,i=65535-1,sum=1+0 =1,value=65535,
False第二次循环,i=65535-2,sum=1+2=3,value=65534,
False第三次循环,i=65535-3,sum=3+1=4,value=65533,
False第四次循环,i=65535-4,sum=4+0=4,value=65532,
False第五次循环,i=65535-5,sum=4+2=6,value=65531, ………
补充一点:for(;i>=0;--i)由于是unsigned无符号,所以并不是i<0退出循环,是当i=0后下一个i的值从最初的0xffff从头再开始
(无法表示-1),也就是说如果for循环里没有break即死循环。-1 = 1000 0000 0000 0001B = 补码:1111 1111 1111 1111 =
无符号则为0xffff,存储方式为补码形式
【i】value:65535~0,而i: 65534~0,(还差一次循坏),所以当value=0时i=初值0xffff=65535;
【Sum】的规律:从false第二次开始看(循环65534~0共65535次),(组1)3,4,4, (组2)6,9,9, (组3)7,10,10…三个为一组,
所以65535/3=21845…0,表示21845组第二个数值,sum=21845*3+1=65536
答案:
65536,65535
|