找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5903|回复: 25
收起左侧

C语言while(i++)循环程序问题

  [复制链接]
ID:521921 发表于 2019-6-28 09:02 | 显示全部楼层 |阅读模式
请教各位师兄,我在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,退出循环
回复

使用道具 举报

ID:10947 发表于 2019-6-28 10:12 | 显示全部楼层
while(i++)
这条语句执行第一次完,i就是4了
回复

使用道具 举报

ID:332444 发表于 2019-6-28 10:29 | 显示全部楼层
程序按顺序执行可知i被先赋值=3进入循环由i++可知为先参与判断运算后自增1,但是这里要注意的是进入下一条执行语句时i已经是增过了的,而在判断时是没自增的,因此,假如设置断点在花括号里面看的话看到的是已增值,假如断点在判断的话就是未增值。假设断点设置在if(!(i%3)) 则此时i的值就是4。
回复

使用道具 举报

ID:300347 发表于 2019-6-28 16:24 | 显示全部楼层
第一次循环完后i就等于4了
回复

使用道具 举报

ID:842314 发表于 2020-11-11 22:03 | 显示全部楼层
求帮解答一下因为用了while指令 break结束指令和i++指令的去向
回复

使用道具 举报

ID:213173 发表于 2020-11-12 09:25 | 显示全部楼层
while(表达式),表达式为真继续循环,表达式为假跳出循环。
回复

使用道具 举报

ID:547021 发表于 2020-11-12 10:53 | 显示全部楼层
初学者一般都会不好区分 i++ 和++i  前者是先执行程序 再加1  后者反之
回复

使用道具 举报

ID:833190 发表于 2020-11-12 11:35 | 显示全部楼层
这不就相当于while(i=3,i=i+1)吗,顺序执行,结果就是while(i=4)
回复

使用道具 举报

ID:843928 发表于 2020-11-15 16:40 | 显示全部楼层
i++ 是前缀自增,++i是后缀自增,  前者表达式的值是i,后者是 i加1  
回复

使用道具 举报

ID:1100371 发表于 2023-11-19 15:58 | 显示全部楼层
lfc315 发表于 2019-6-28 10:12
while(i++)
这条语句执行第一次完,i就是4了

我也遇到了这样的问题,他的意思是在还没有进入循环体之前,i就自增了的原因
回复

使用道具 举报

ID:883242 发表于 2023-11-19 16:44 | 显示全部楼层
1002846769 发表于 2023-11-19 15:58
我也遇到了这样的问题,他的意思是在还没有进入循环体之前,i就自增了的原因

进没进入循环体完全不重要,重要的是while判断的时候i++没有执行就符合语法。
回复

使用道具 举报

ID:712493 发表于 2023-11-19 18:13 | 显示全部楼层
while(i++)这个是基于什么需求这样写?或这样写有啥好处?
回复

使用道具 举报

ID:397054 发表于 2023-11-19 20:49 | 显示全部楼层
[先赋值计算后自加]更准确合理的说法是[先引用后自加]

实例是,如果i=0,

那么:

while(i++)
  {
    程序体
  }

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

while(++i)
  {
    程序体
  }

程序体会被执行,且一直循环执行直到i加到0为止。
回复

使用道具 举报

ID:1100418 发表于 2023-11-19 22:20 | 显示全部楼层
执行完while(i++)后,i为4,所以第一次循环(i%3)中i为4。如果int i=2,则直接跳出循环,输出结果s=0。
回复

使用道具 举报

ID:1100640 发表于 2023-11-21 14:10 | 显示全部楼层
test.png
看了多人的答案后自己测试了i++和++i 这样应该直观吧(给点分

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:1100640 发表于 2023-11-21 14:10 | 显示全部楼层
我发的咋不见了
回复

使用道具 举报

ID:883242 发表于 2023-11-22 21:19 | 显示全部楼层
夕口山关 发表于 2023-11-21 14:10
看了多人的答案后自己测试了i++和++i 这样应该直观吧(给点bb)

学的很不错,测试代码很漂亮。
回复

使用道具 举报

ID:352989 发表于 2023-11-23 11:10 | 显示全部楼层
是不是可以这么理解:while(i++)相当于计算机执行了2条语句。while(i=3, i=i+1).
回复

使用道具 举报

ID:1100995 发表于 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
回复

使用道具 举报

ID:352989 发表于 2023-11-24 13:58 | 显示全部楼层
ultrasonic 发表于 2023-11-24 10:38
i 被初始化为3,s 初始化为0。 进入 while 循环,首先 i 的值是3。 在循环中,首先进行了 i++ 运算,i 自增 ...

感谢19楼的解答!
回复

使用道具 举报

ID:491577 发表于 2023-11-25 00:09 | 显示全部楼层
楼主不要纠结i++与++i的区别,正常使用中一般没有区别,这两种方式主要是i自加1,不需要考虑其他,楼主这个程序不管用哪一个都不影响结果。while(i++)与 while(++i)严格来说是有区别,i=0,负数或者让i一直加到溢出才会有区别,正常人写的程序不会出现这种情况的。
回复

使用道具 举报

ID:1101272 发表于 2023-11-26 17:25 | 显示全部楼层
先判断i是否大于0,判断完i加一,然后再进入while的内容
回复

使用道具 举报

ID:1101344 发表于 2023-11-27 09:20 | 显示全部楼层
前面while(i++)的时候i就等于4了
回复

使用道具 举报

ID:1101427 发表于 2023-11-27 17:00 | 显示全部楼层
i++作为单独的原算式,while(i++),while先判断i=3循环,然后i+1,i=4带入后面的函数
回复

使用道具 举报

ID:1101427 发表于 2023-11-27 17:01 | 显示全部楼层
i在while先进行判定,之后加一,所以在函数里i为4
回复

使用道具 举报

ID:1101520 发表于 2023-11-28 09:31 | 显示全部楼层
i++是先执行后运算,但是在while里他已经执行过了,就是i=i+1了已经。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表