标题: C语言while(i++)循环程序问题 [打印本页]

作者: WGL88    时间: 2019-6-28 09:02
标题: C语言while(i++)循环程序问题
请教各位师兄,我在C语言教材中看到如下一段代码,疑问:1.while(i++)不是先赋值计算后自加么,也就是i=3先参与运算,后自加到4?下面的程序解释是先自加到4再参与循环,请师兄们帮忙解释下,谢谢!
int i=3,s=0;while(i++)
{
   if(!(i%3))
   break;
   else
   s+=i;
}
printf("s=%d",s)
输出的结果是:s=9;
//if (!(i%3)) i能被3整除时 条件为真

while(i++)第一次循环 i的值为4,s的值为4第二次循环 i的值为5,s的值为4+5=9第三次 i=6,退出循环

作者: lfc315    时间: 2019-6-28 10:12
while(i++)
这条语句执行第一次完,i就是4了
作者: xianfajushi    时间: 2019-6-28 10:29
程序按顺序执行可知i被先赋值=3进入循环由i++可知为先参与判断运算后自增1,但是这里要注意的是进入下一条执行语句时i已经是增过了的,而在判断时是没自增的,因此,假如设置断点在花括号里面看的话看到的是已增值,假如断点在判断的话就是未增值。假设断点设置在if(!(i%3)) 则此时i的值就是4。
作者: 555jb    时间: 2019-6-28 16:24
第一次循环完后i就等于4了
作者: chenqingxin1109    时间: 2020-11-11 22:03
求帮解答一下因为用了while指令 break结束指令和i++指令的去向

作者: wulin    时间: 2020-11-12 09:25
while(表达式),表达式为真继续循环,表达式为假跳出循环。
作者: CGS1273972181    时间: 2020-11-12 10:53
初学者一般都会不好区分 i++ 和++i  前者是先执行程序 再加1  后者反之
作者: i_could_have    时间: 2020-11-12 11:35
这不就相当于while(i=3,i=i+1)吗,顺序执行,结果就是while(i=4)
作者: aikeyi    时间: 2020-11-15 16:40
i++ 是前缀自增,++i是后缀自增,  前者表达式的值是i,后者是 i加1  

作者: 1002846769    时间: 2023-11-19 15:58
lfc315 发表于 2019-6-28 10:12
while(i++)
这条语句执行第一次完,i就是4了

我也遇到了这样的问题,他的意思是在还没有进入循环体之前,i就自增了的原因
作者: Hephaestus    时间: 2023-11-19 16:44
1002846769 发表于 2023-11-19 15:58
我也遇到了这样的问题,他的意思是在还没有进入循环体之前,i就自增了的原因

进没进入循环体完全不重要,重要的是while判断的时候i++没有执行就符合语法。
作者: fj51hei    时间: 2023-11-19 18:13
while(i++)这个是基于什么需求这样写?或这样写有啥好处?
作者: 鹈鹕    时间: 2023-11-19 20:49
[先赋值计算后自加]更准确合理的说法是[先引用后自加]

实例是,如果i=0,

那么:

while(i++)
  {
    程序体
  }

—— 程序体不会被执行直接跳过;

while(++i)
  {
    程序体
  }

程序体会被执行,且一直循环执行直到i加到0为止。
作者: 庭姊    时间: 2023-11-19 22:20
执行完while(i++)后,i为4,所以第一次循环(i%3)中i为4。如果int i=2,则直接跳出循环,输出结果s=0。
作者: 夕口山关    时间: 2023-11-21 14:10

看了多人的答案后自己测试了i++和++i 这样应该直观吧(给点分

作者: 夕口山关    时间: 2023-11-21 14:10
我发的咋不见了
作者: Hephaestus    时间: 2023-11-22 21:19
夕口山关 发表于 2023-11-21 14:10
看了多人的答案后自己测试了i++和++i 这样应该直观吧(给点bb)

学的很不错,测试代码很漂亮。
作者: duanlian    时间: 2023-11-23 11:10
是不是可以这么理解:while(i++)相当于计算机执行了2条语句。while(i=3, i=i+1).
作者: ultrasonic    时间: 2023-11-24 10:38
i 被初始化为3,s 初始化为0。 进入 while 循环,首先 i 的值是3。 在循环中,首先进行了 i++ 运算,i 自增为4。 接着进入 if (!(i % 3)) 判断,i % 3 等于1,因为4除以3余数为1,所以条件不成立。 执行 else 分支,s += i;,也就是 s += 4;,所以此时 s 的值变为4。 因为 s 的值变成了4,但循环条件判断依然为真,所以继续循环。 i 继续自增为5。 再次进入 if (!(i % 3)) 判断,i % 3 等于2,条件不成立。 执行 else 分支,s += i;,也就是 s += 5;,所以此时 s 的值变为4 + 5 = 9。 循环继续,i 自增为6。 进入 if (!(i % 3)) 判断,i % 3 等于0,因为6除以3余数为0,所以条件成立。 执行 break; 语句,跳出循环。 最终,printf 输出的结果是 s=9
作者: duanlian    时间: 2023-11-24 13:58
ultrasonic 发表于 2023-11-24 10:38
i 被初始化为3,s 初始化为0。 进入 while 循环,首先 i 的值是3。 在循环中,首先进行了 i++ 运算,i 自增 ...

感谢19楼的解答!
作者: hhh402    时间: 2023-11-25 00:09
楼主不要纠结i++与++i的区别,正常使用中一般没有区别,这两种方式主要是i自加1,不需要考虑其他,楼主这个程序不管用哪一个都不影响结果。while(i++)与 while(++i)严格来说是有区别,i=0,负数或者让i一直加到溢出才会有区别,正常人写的程序不会出现这种情况的。
作者: wjayz    时间: 2023-11-26 17:25
先判断i是否大于0,判断完i加一,然后再进入while的内容
作者: asdfggfdsaqq    时间: 2023-11-27 09:20
前面while(i++)的时候i就等于4了
作者: 爱咋咋地123    时间: 2023-11-27 17:00
i++作为单独的原算式,while(i++),while先判断i=3循环,然后i+1,i=4带入后面的函数
作者: 爱咋咋地123    时间: 2023-11-27 17:01
i在while先进行判定,之后加一,所以在函数里i为4
作者: qiqix    时间: 2023-11-28 09:31
i++是先执行后运算,但是在while里他已经执行过了,就是i=i+1了已经。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1