首页 > 试题广场 >

这段代码的输出结果是: void main(void) {

[单选题]
这段代码的输出结果是:
void main(void)
 {
     bool first = true;
     int sum = 0;
     int current_value;
     for (unsigned short i = 65535; i >= 0; --i)
     {
         if (first)
         {
             current_value = 65536;
             sum += current_value % 3;
             first = false;
         }
         else
         {
             sum += --current_value % 3;
             if (current_value <= 0)
             {
                 printf(“ % d % d”, sum, i); break;
             }
         }
     }
 }

  • 65535,0
  • 65536,1
  • 65536,65535
  • 65536,0
选c
首先程序可以简化成这样。
int main()
{
bool first = true;
int sum = 1;
int current_value = 65536;
for( unsigned short i = 65534 ; i >= 0 ; --i )
{

sum += --current_value % 3;
if( current_value <= 0 )
{
printf( "%d %d " , sum , i ); break;
}

}
return 0;
}
再接下来简化
上面的循环是一个死循环。不起作用的,因为unsigned short是正数,不可能小于0,所以如果要 退出循环只能看下面的break被触发。接下来看
for循环每执行3次
current_alue 减少3 ,sum 加了3
所以程序运行了65535次后
current_value = 0
sum = 1 + 65535 = 65536
i =65535



发表于 2015-03-27 15:16:00 回复(0)
毫无疑问,这个程序一定会执行 65536 次循环,那么,i 会减去 65536,sum也会加上65536
unsigned short 的 i = 65535 - 65536 = 65535,这是溢出了,相当于 0 - 1 = 65535。


简化代码:

voidmain(void)
{
     int sum = 0;
     int current_value = 65536;
     for (unsigned short i = 65535-1; i >= 0; --i)
     {
             sum += current_value-- % 3;
             if (current_value <= 0)
             {
                 printf("%d,%d", sum, i); break;
             }
     }
}




发表于 2015-08-01 11:30:41 回复(0)