黑马程序员技术交流社区

标题: while语句的问题 [打印本页]

作者: 高鑫    时间: 2012-4-27 02:12
标题: while语句的问题
  请问下面这个循环语句中,第一个if+语句,else if+语句,if+语句,这3部分哪几部分属于while循环结构。

        
        while(min<=max )
        if(key>arr[mid])                           //第一个if
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;
   


作者: 贾联国    时间: 2012-4-27 03:30
这是二分法找key的方法,三个if肯定都在循环里,也都属于循环,具体看代码:
  1. while(min<=max )
  2.         if(key>arr[mid])                           //第一个if 判断key离min较近,可以让max向min移动,需要循环
  3.             min=mid+1;                  
  4.             else if(key<arr[mid])                   //第二个else if 判断key离max较近,可以让min向max移动,需要循环
  5.                 max=mid-1;
  6.             if  (key==arr[mid])                    //第3个if 判断key和max与min的中间值是否相等,前两个条件循环的同时,这个也有可能成立
  7.                 return mid;
  8.             mid=(min+max)/2;
复制代码

作者: 高彰谦    时间: 2012-4-27 05:51
第三个if断开了,不属于while体内
作者: 光sail    时间: 2012-4-27 07:43
while(min<=max )
        if(key>arr[mid])                         //while循环内
            min=mid+1;                  
            else if(key<arr[mid])                   //while循环内
                max=mid-1;
            if  (key==arr[mid])                    //while循环外
                return mid;
            mid=(min+max)/2;

作者: 陆强强    时间: 2012-4-27 08:18
本帖最后由 陆强强 于 2012-4-27 08:20 编辑

三个循环都不能放在循环外,不然你这代码执行不了,
while(min<=max )
  {
    if(key>arr[mid])                        
            min=mid+1;
    else if(key<arr[mid])                 
            max=mid-1;
    if  (key==arr[mid])                  
            return mid;
    mid=(min+max)/2;
  }
   return min;
作者: 马浩    时间: 2012-4-27 08:39
while(min<=max )
        if(key>arr[mid])                           //第一个if//只有这一个if语句是属于while循环的循环体
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;
楼主想做的是折半查找吧,while循环的时候,在没加大括号的情况下,会把与它最近的一个语句作为循环体的,后面的都不在循环之内……为了避免这种情况出现,在些循环结构的时候还是按照格式,不管循环体是一句还是多句,都加上括号,这样安全,if,for都是这样的
作者: HeiMaYSL    时间: 2012-4-27 14:27
         while(min<=max )
         if(key>arr[mid])                           //第一个if  
             min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                 max=mid-1;
             if  (key==arr[mid])                    //第3个if
                 return mid;
             mid=(min+max)/2;
    当然是第一个if在while循环结构里了。因为程序在执行没有加大括号限制范围时,就会自动按照临近原则,
执行离它最近的那一行代码。
        不过,这样写虽然简化了,但是,很不利于阅读。最好按照规范来写。这样方便他人和自己日后观看和阅读。
作者: 丁佼    时间: 2012-4-27 15:54
   while(min<=max )
        if(key>arr[mid])                           //第一个if
            min=mid+1;  

只有第一个if属于while管辖,在没有{}标示范围的情况下,第一个分号(;)标志了循环或者if等流程控制语句块的结束。
作者: 任睦强    时间: 2012-4-27 15:55
while(min<=max ){
        if(key>arr[mid])                           //第一个if
            min=mid+1;                  
            else if(key<arr[mid])                   //第二个else if
                max=mid-1;
          }
            if  (key==arr[mid])                    //第3个if
                return mid;
            mid=(min+max)/2;

被红色括号括起来的是一个逻辑,它在while循环中
蓝色部分在循环外
作者: 胡奎    时间: 2012-4-27 15:58
都在循环里




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2