while(scanf("%d",&n), n<=0);就是说当你输入一个数字n时如果n<=0时,执行while循环,不向下执行直到你输入的数字n>0,开始执行下面的语句。while(!(t<=n&&t*2>=n)){ t=t*2; m++; }当t<=n与t*2>=n有一个为假时,!(t<=n&&t*2>=n)为真,while循环就执行下去,直到t<=n与t*2>=n同时为真while循环结束。用m记录2的开方的次数,t用来记录2的m次方的大小。