首页 > 试题广场 >

下面程序输出是什么

[单选题]
下面程序输出是什么
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;
}
  • 1,65535
  • 65535,65535
  • 65535,65536
  • 65535,1
  • 65536,65535
推荐
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
编辑于 2016-04-25 23:32:37 回复(12)
比较复杂 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
发表于 2017-12-09 08:30:40 回复(0)
看到推荐解析算sum好复杂,其实sum就是value从65536减到1每次%3,而65536%3=1,65535%3=0,65534%3=2.。。。余数一直是102,102这样出现的,因为是对3取模嘛。那么相加起来就把1+0+2看成是1+1+1,更好理解,结果一样, 最后一次1%3=1。所以value从65536到1是执行了65536次,余数加起来就是65536个1相加,sum等于65536.
发表于 2016-09-03 10:41:55 回复(8)
做题的话,只需要知道sum比i大1
发表于 2017-04-02 09:52:32 回复(2)
这题没那么复杂吧!
1、就是++运算优先级高于%,所以每次都是先自减再求余
2、因为i是无符号的当i自减到-1时 其实是以补码的形式存的
ps:用break是因为题目循环其实是个死循环
发表于 2016-03-05 19:58:17 回复(0)
由于i是无符号数,因此 i>=0恒成立,代码停止条件为value<=0。另外注意,--的优先级高于%。
1、if(first)只执行一次,执行结果为sum=1;value=65536.
2、此后的for循环一直执行else中的代码。试着找一个规律,每3个for循环,value值减少3,sum值增加3,因此当3的倍数次for循环之后,value等于1时(65536%3=1),sum值等于1+(65536-1)=65536. 这时已经执行了65536次for循环了,从第二次for循环开始执行--i,此时i=0x0000。
3、当value=1时,执行最后一遍for循环中else的语句,--value,所以 value=0。sum+=value%3,所以sum=65536+0=65536。 i-1=-1=0xFFFF, 所以cout<<i,i转为十进制无符号数为65535.
发表于 2016-09-05 14:47:03 回复(0)
1. value不断自减取余,余数累加的结果sum其实就是value的初始值65536;
2. i=0xFFFF=65535,不断自减直到为-1,但i是unsigned short类型,所以-1按补码存储为0xFFFF,还是65535。
编辑于 2019-07-06 21:04:21 回复(0)
做题的话,只需要知道sum比i大1
发表于 2020-07-21 12:33:31 回复(0)
True只经历1次, i=65535,value=65536,value%3=1;
False第1次循环,i=65534,value=65535,value%3=0;
False第2次循环,i=65533,value=65534,value %3=2;
......
之后value%3的结果一直是1,0,2循环,即每3次循环sum+3;
......
False第65535次循环,i=0,value=1,value%3=1;
False第65536次循环,i=65535,value=0,value%3=0;//变量i是unsigned short类型,0再减去1等于65535
故最后sum=2+0+1...(每3次循环余数和为3,所以前65535(3的倍数)次循环余数和为65535,再加最后1次循环的余数1,最后sum=65536,而i=65535)
发表于 2017-06-19 10:32:58 回复(0)
i                65535            65534        65533             ......              0                65535
value        65536            65535        65534             ......              1                0
sum          1                    1+0            1+0+2             ......                        1+0+2+1+0+2+...+1+0                       

==>sum=(1+0+2)*(65535)/3+1=65536            i=65535
编辑于 2017-01-16 19:37:08 回复(0)

在循环中,变量i的类型是无符号短整型,初始值是 0xFFFF。因此,在每次迭代中,它都会减去 1,直到为 0,才会退出循环。因为i是无符号类型,所以它永远不会小于 0。由于循环的迭代次数是有限的,即 2^16 次,因此循环将在最后一次迭代中退出。

循环变量value的初始值是 65536,每次迭代时,它会减去 1,并累加到变量sum中。在第一次迭代中,程序会将65536累加到sum中,然后将value减 1 变成 65535,这个过程反复执行,直到循环结束。

当i变成 0 时,程序输出sum和i的值。此时sum的值为 65536,i的值为 65535。因为sum的初值就是 65536,而循环内部每次都将value的值累加到sum中,所以在循环结束时,sum的值就是 65536。而i的值最后减去 1 变成 0,导致循环退出。

发表于 2023-10-20 21:18:46 回复(0)
这种题作为选择题确实很烧脑!
发表于 2018-03-28 11:23:18 回复(0)
看了大家解析,就丹尼尔思路不错。 我是这么想的,第一次是65536的时候,先自减1变成65535,那么除3正好余数为0,那么sum还是保持1。发现从65535开始自减1,每保持自减3次,而sum每次加上前者的余数,每经过3次,正好加上3。 所以最终结果就是65535+1=65536。这个1就是一开始65536自减的时候,那个1。 当for循环执行了65536次,即i=0,循环体执行完后,接着执行--i,此时i=65535(无符号),满足循环条件,又进入循环体,此时value=0,执行输出语句。所以i=65535
发表于 2017-06-23 10:07:07 回复(0)
可是“sum+=--value%3;”到底是什么意思呢,sum+((value%3)-1)?
发表于 2023-09-06 16:41:59 回复(0)
无符号i,可得for循环会一直跑。只有在value >=0  时,会跳出for,并输出语句。而从一开始65535对3取余可得为0,(65535-1)对3取余得2,(65535 - 2)取于得1,下次减去1,余又为0。所有可以得到每减去3个值,sum会加3. 将65535 / 3 = 21845,得到sum = 3 * 21845.而for刚开始时,if中为value = 65536, sum = 1。所有总的 sum = 65535 +1 = 65536 . 
发表于 2023-08-24 15:38:42 回复(0)
放弃计算。你们算吧
发表于 2023-07-05 21:27:12 回复(0)
服了, 没看到E选项(单选不是都是4选1吗?), 本来算出 sum=65536的.
发表于 2022-11-24 02:28:36 回复(0)
确实,sum比i大1
发表于 2022-04-29 21:59:57 回复(0)
cout语句能执行两次吗?
发表于 2019-03-08 08:19:05 回复(0)
这道题的思路是每次循环sum加1,value减1,i每次循环减1,而value=65536,unsigned int i=0xFFFF(为65535),当value减到0时,i 减到了-1(因为 i 是unsigned 所以i又等于了65535
发表于 2018-05-09 20:58:59 回复(0)
0xFFFF确实是65535,但由于i是无符号短整形的,当循环65535次后,i=0,此时再进行一次--i,这个时候i又变回了65535.
发表于 2018-03-15 20:33:42 回复(0)