c语言while 1如何跳出,能够从while(1)循环中跳出去吗?

回复: 48

e5a73b6a7586c690ae7a720f72a4e733.png

ccfb3c64a5000ccc1971125e1fdae7b2.png

20f7beba86b4a360a2108c8a34a4ebf3.png

能够从while(1)循环中跳出去吗?

83ce3ea77387579801bba450dd75b32b.png

(307841813)

出0入0汤圆

电梯直达

ac34f29e61779188a50d361fdeae2c1f.png

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:12:33

|

只看该作者

8d1228179cec554492e4b5a60a447513.gif

|倒序浏览

|阅读模式

刚想再switch语句中的case选择下一种情况,可是出现无法跳出去了 是因为加了个while语句

switch(w)

{

case 0 :

{        ShowString(20,20,"EGC",0,255);

break;

}

case 1 :

{        LCD_Clear(255,0);          //清屏

ShowString(2,2, "START",0xe0,255);

Delay(15);

while(1)

{

AD_value=ADC_GetConversionValue(ADC1);

value=AD_value*3.3/4096.0;

........}

break;

}

case 3 :

....

知道是因为有了while循环在, 可是必须得用死循环

不知道大家有什么好的方法,

让case语句能够使用 ,

是否while(1)也可以跳出来呢?

9f3da09aea01dc85044b2dcf89bebbd6.png

(307841537)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:17:09

|

只看该作者

goto?

精华汤圆中级会员

{*}

417ed852d27e8c159716eac4e3779f56.gif

a455484b8fc2a083b66cc093fe04f157.png

(307841450)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:18:36

|

只看该作者

嗯 goto 应该可以

857aec468e5c7e92184cc71b68a544ec.png

(307841270)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:21:36

|

只看该作者

没看明白啥意思

少用goto

尽量用条件循环代替while(1)

0dfcc56120449999ea7d19daff2ad850.png

(307841239)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:22:07

|

只看该作者

在while(1)的大括号中需要跳出的语句后加break就可以跳出。

9e478ad346645082cb6f34495505bfea.png

(307841043)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:25:23

|

只看该作者

如果在函数里面,RETURN也可以退出

8e39bd1aa28584a97c0051ae865dd627.png

(307840639)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:32:07

|

只看该作者

while(1)内使用条件 break;switch中需要跳出时置跳出条件。

16_avatar_middle.jpg

(307840562)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:33:24

|

只看该作者

bool flag = TRUE;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = FLASE;

...

}

d0a6306c0ce8324ba47c2e4503a4261c.png

(307840051)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:41:55

|

只看该作者

回复【7楼】xiaoking 蒋杰

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = flase;

...

}

-----------------------------------------------------------------------

同意这个, goto 之类的东西还是尽量别用

另外楼主的话其实有点自相矛盾, 你既要跳出去, 还要死循环, 这本身就矛盾吗

既然要跳出去, 就说明这个循环不是死循环, 是有跳出去的条件的

374a1e6b5a46433edab800f116cbc110.png

(307839465)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 14:51:41

|

只看该作者

没有什么是绝对必须要用的,可以考虑在中断或主循环里计算。

99_avatar_middle.jpg

(307838765)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 15:03:21

|

只看该作者

顶7楼

117656d143f9bbefc69ce7e2d2609c18.png

(307837999)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 15:16:07

|

只看该作者

不推荐用while(1) 容易造成死循环,7楼的方法不错.

15_avatar_middle.jpg

(307836427)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 15:42:19

|

只看该作者

断电,就可以了

9ac4d1d14fd4eee6ad4754963b44e589.png

(307834597)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 16:12:49

|

只看该作者

回复【11楼】dongls  董

不推荐用while(1) 容易造成死循环,7楼的方法不错.

-----------------------------------------------------------------------

那是你程序没写好。。。俺刚用了个。。。

当前离线积分

精华汤圆注册会员

{*}

417ed852d27e8c159716eac4e3779f56.gif

2964f19a03731ccd4f6d24eeb5b1e42e.png

(307832044)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 16:55:22

|

只看该作者

调试的时候尝试过跳出main函数执行,结果是程序直接跑飞

75b02424b22007d5c7344245b4d56742.png

(307827096)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 18:17:50

|

只看该作者

七楼真的回复的好啊

回复【7楼】xiaoking 蒋杰

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = flase;

...

}

-----------------------------------------------------------------------

同意这个, goto 之类的东西还是尽量别用

另外楼主的话其实有点自相矛盾, 你既要跳出去, 还要死循环, 这本身就矛盾吗

既然要跳出去, 就说明这个循环不是死循环, 是有跳出去的条件的

83ce3ea77387579801bba450dd75b32b.png

(307825605)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-16 18:42:41

|

只看该作者

回复【8楼】alengend

-----------------------------------------------------------------------

恩 感谢 呵呵 是有点矛盾

本意是while里面的句子能够循环

但是还得照顾case语句 希望case里面的break依旧有效

83ce3ea77387579801bba450dd75b32b.png

(307825537)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-16 18:43:49

|

只看该作者

回复【1楼】fnems

-----------------------------------------------------------------------

goto语句 都说少用 所以 用的也比较少 要是没有选择的话才用 尽量别用

83ce3ea77387579801bba450dd75b32b.png

(307825182)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-16 18:49:44

|

只看该作者

回复【7楼】xiaoking 蒋杰

-----------------------------------------------------------------------

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = flase;

...

}

-----------------------------------------------------------------------

这个好 非常感谢

之前还想再while里面判断case条件是否成立

结果更加混乱 又学到了啊

83ce3ea77387579801bba450dd75b32b.png

(307824993)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-16 18:52:53

|

只看该作者

回复【13楼】huayuliang 花生

回复【11楼】dongls  董

不推荐用while(1) 容易造成死循环,7楼的方法不错.

-----------------------------------------------------------------------

那是你程序没写好。。。俺刚用了个。。。

-----------------------------------------------------------------------

我的那个程序确实有问题啊

呵呵

stm32中 有些是得用while(1)的

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

2e55b1403c1747d1e1ab61dc69fdc31f.png

(307824136)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 19:07:10

|

只看该作者

goto 就可以。。

while(1)

{

~~~

~~

if (xx)

goto next;

else

xxx;

}

next:

xxxx;

4ae65951baaa66b38f469c2b3886150f.png

(307823847)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 19:11:59

|

只看该作者

用return

7c08664c030e27f0773bed95bc4e97dd.png

(307821875)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 19:44:51

|

只看该作者

LINUX内核和WINDOWS MFC中都有用GOTO的。没什么大不了。

LZ的程序用那么多WHILE,结构应该重规划,而不是想如何跳出了。

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-16 19:53:36

|

只看该作者

回复【7楼】xiaoking 蒋杰

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = flase;

...

}

-----------------------------------------------------------------------

这样写,条件满足后,后面的 ...段还要再执行一次吗?

83ce3ea77387579801bba450dd75b32b.png

(307812980)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-16 22:13:06

|

只看该作者

回复【22楼】Excellence 精益求精

linux内核和windows mfc中都有用goto的。没什么大不了。

lz的程序用那么多while,结构应该重规划,而不是想如何跳出了。

-----------------------------------------------------------------------

恩 确实

感觉思路不太清晰 程序间会撞车

得重新规划下

16_avatar_middle.jpg

(307774825)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 08:49:01

|

只看该作者

回复【23楼】liangyurongde

回复【7楼】xiaoking 蒋杰

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = flase;

...

}

-----------------------------------------------------------------------

这样写,条件满足后,后面的 ...段还要再执行一次吗?

-----------------------------------------------------------------------

还会再执行1次

如果不需要执行,可将if()判断放在最后,或者这样:

bool flag = true;

while (flag)

{

...

if (条件满足,需要跳出while循环)

flag = false;

else

{

...

}

}

实际代码需要根据具体程序功能编写

9eabe1fdf703c3b79ef422591faa5f61.png

(307774450)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 08:55:16

|

只看该作者

都是高手,呵呵

7c08664c030e27f0773bed95bc4e97dd.png

(307773228)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 09:15:38

|

只看该作者

如果是在MAIN中,那么一个WHILE(1)和一个SWITCH就可以解决95%的事情。

其他都是跳转条件。

17c7e24a0d625eddf6ed6ce9cbc6683a.png

(307771051)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 09:51:55

|

只看该作者

break 或者return

74_avatar_middle.jpg

(307769577)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 10:16:29

|

只看该作者

你要跳出循环 为什么还要进入while(1)?

既然需要跳出循环 肯定有满足的条件

if(条件满足)

{

break;

}

c4d68bbeaa26c3d446d1a2e260114e0c.png

(307766988)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 10:59:38

|

只看该作者

对于下面这种格式的主函数

int main()

{

xxx;

xxx;

```

```

while(1)

{

xx;

```

if(x)

{

switch(x)

case x1:

xx;

break;

case x2:

xx;

break;

}

xx;

}

else if(x)

{

xx;

return 0;

}

else

{

xx;

break;

}

}

return 0;

}

一直对break、return有点疑惑(C语言没学好哈),借这个机会小弟在这提一下自己的理解,大家看看我对break、return的理解有没有问题:

对于switch里的break是跳出switch的执行,然后执行switch后的xx语句;else if里返回return 0,而int main接收到返回值后,整个main函数就立即执行结束(如果main函数改为void main,而else if里return 0改为return,那么执行到return后,是返回到main的第一条语句处开始执行,区别:一个是结束main,一个是main函数从头开始执行);而else里的执行到break后是跳出while(1)循环,然后从main函数的第一条语句开始执行。

ca3d860cefc4d7e6ebfabdb17bf75357.png

(307762736)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 12:10:30

|

只看该作者

回复【楼主位】li0709 清水潇湘

-----------------------------------------------------------------------

我也遇到过这种问题。

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 15:38:26

|

只看该作者

回复【25楼】xiaoking 蒋杰

-----------------------------------------------------------------------

if (条件满足,需要跳出while循环)

{

flag = false;

continue;

}

这样就可以不用写得那么别扭了。

而且你在25楼那句flag = false;没有加{ },程序编译时不会报错吗?

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-17 17:20:40

|

只看该作者

回复【楼主位】li0709 清水潇湘

-----------------------------------------------------------------------

谢谢楼主有用啊

27b0d63c759f6d63ac764e80583e22dc.png

(307674771)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 12:36:35

|

只看该作者

少用goto不等于就一定不能用goto

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

2e55b1403c1747d1e1ab61dc69fdc31f.png

(307673586)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 12:56:20

|

只看该作者

有goto用为什么不用goto。

书上是说要少用goto。。不过我不明白为什么要少用。该用的时候就用么。。。

这样用着不是挺好的。。

d1b9a4a3a0b6fb1911ea2a444c194bce.png

(307668820)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 14:15:46

|

只看该作者

没错误,不用goto

有错误,就用goto

楼主的问题,为什么一定要 while(1) ?

volatile int flag;

flag = 1;

while (flag)

{

}

然后在中断里面可以将 flag 置0 就能退出了。

682d629e9a071d9cbf37affe12e2764c.png

(307661103)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 16:24:23

|

只看该作者

我觉得goto语句很好多~~~

73101dee8f1a4fd065c539c08d2c9bdf.png

(307660897)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 16:27:49

|

只看该作者

goto就失去了C语言的精髓。。。

d0a6306c0ce8324ba47c2e4503a4261c.png

(307660283)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 16:38:03

|

只看该作者

goto不是不能用,只不过要谨慎使用。

我个人认为有两种情况你可以放心的用goto:

一是程序很简单,代码很少 结构也一目了然, 你放心用

二是你本人是高手,那你当然可以放心用。

83ce3ea77387579801bba450dd75b32b.png

(307641539)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-18 21:50:27

|

只看该作者

回复【36楼】Etual

没错误,不用goto

有错误,就用goto

楼主的问题,为什么一定要 while(1) ?

volatile int flag;

flag = 1;

while (flag)

{

}

然后在中断里面可以将 flag 置0 就能退出了。

-----------------------------------------------------------------------

用while(1)的原因是想一直采集AD转换后的信号 可以做到实时操作 然后显示到液晶上面

这个题其实就是做个心电仪 先用硬件放大心电信号 再用软件 通过键盘操作类似菜单 最后在液晶上实时显示心电脉冲

其实我的思路很简单 以键盘为主题 (4*4的键盘)

通过键值 使用switch case语句

这样就可以做一个类似菜单的东西 case里面采集AD状态值 扫描打点画线 最后驱动液晶显示

算是个多功能的玩意 以后想能显示时间 测量信号频率相位之类的

47e6579a7764ac866e9519405c24ac53.png

(307641153)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 21:56:53

|

只看该作者

mark

当前离线

精华汤圆中级会员

{*}

417ed852d27e8c159716eac4e3779f56.gif

4cdd4cf041bda354032274ffd7f51e00.png

(307640302)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2011-8-18 22:11:04

|

只看该作者

回复【楼主位】li0709 清水潇湘

刚想再switch语句中的case选择下一种情况,可是出现无法跳出去了 是因为加了个while语句

switch(w)

{

case 0 :

{ showstring(20,20,"egc",0,255);

break;

}

case 1 :

{ lcd_clear(255,0);   //清屏

showstring(2,2, "start",0xe0,255);

delay(15);

while(1)

{

ad_value=adc_getconversionvalue(adc1);

value=ad_value*3.3/4096.0;

........}

break;

......

-----------------------------------------------------------------------

while(1)

{

ad_value=adc_getconversionvalue(adc1);

value=ad_value*3.3/4096.0;

........}

放到一个新建函数里,设一个条件 条件成立用return 可跳出while(1)。

83ce3ea77387579801bba450dd75b32b.png

(307639256)

出0入0汤圆

3ed6c70162101cdc4cfc0ceaf175c8cd.png

楼主|

发表于 2011-8-18 22:28:30

|

只看该作者

回复【42楼】Asch 阿希

-----------------------------------------------------------------------

恩 我当时想过用函数调用 直接把采集打点函数声明定义

然后直接引用 貌似还没有成功

程序功底不够啊 呵呵

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

4e061c81d1b1deb4dcc905bb0489ba4b.png

(285998901)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2012-4-25 09:41:05

|

只看该作者

Excellence 发表于 2011-8-17 09:15 thread-4968929-1-1.html

如果是在MAIN中,那么一个WHILE(1)和一个SWITCH就可以解决95%的事情。

其他都是跳转条件。 ...

同感......

be07ab477272ad8e928134210fb94435.png

(285994232)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2012-4-25 10:58:54

|

只看该作者

最好通过函数调用跳出

4e3a061a6cee689711774664b8e32641.png

发表于 2012-4-25 11:18:38

|

只看该作者

UIP协议 里面的uip_process函数大量采用goto  。 代码确实很简洁!

6f435e1f3c6aef0ccf11e749c0867ffc.png

(285990540)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2012-4-25 12:00:26

|

只看该作者

在while(1)中判断条件+return

70bafb9fee7e6fc32742e983ae2c4f1d.png

(285989072)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2012-4-25 12:24:54

|

只看该作者

加break或者return

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值