你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

for(;;)代码为什么不写成while(1)呢?

[复制链接]
gaosmile 发布时间:2021-1-28 14:47

看代码看到for(;;),然后觉得为什么不写成while(1)呢,所以就做了下面的测试。

网上有解释,因为while需要做一次判断,理论上执行会花费的时间更久,for(;;)只是执行了两次空语句,执行会更快

for.c

#include <stdio.h>0 K: J: ?0 F7 |3 Y% ~7 B8 f0 B. \8 X  _
int main(){& B$ K( _# J2 }
   for(;;)$ ?) w, Q% S# m. o9 ?
      printf("This is a loop\n");8 T. g1 p$ o2 ^% g4 o
   return 0;% q! P4 c2 s9 M$ q/ O8 g
}
: I  w3 c5 ~7 e2 U+ m. F

while.c

#include <stdio.h>
! T2 \% G4 x; i: u9 Xint main(){
$ h( p0 l! Q* Z1 k* q/ u   while(1)( s. m$ \4 m8 M1 ~! x% f
      printf("This is a loop\n");
  L5 l' r; ~: j   return 0;+ y5 i; _+ B6 o6 a6 ^
}
4 J; j6 ]) V" m% V; q( Y; v

goto.c

#include <stdio.h>
3 A# v. m3 v1 q# Fint main(){
5 F  y% ?; h1 {" V2 K* M( W   start:
) l0 R: [: b; h8 j0 P: f  \      printf("This is a loop\n");4 P& g* _$ \% e; O0 T$ ~% s
    goto start;$ D5 q: L, @/ Y& i
   return 0;
3 v9 |% [5 |% S; V}5 t# P7 @: V8 X1 R7 G

用gcc -S xxx.c 执行后得到三个文件

for.s

.file "for.c"
4 p0 k# Q" @; G. ?( M8 d, ]1 X5 \ .text2 b/ H0 d: i6 ^& a( _
.section .rodata7 [  c: y2 o5 I
.LC0:
8 d4 m2 D% ]8 ]4 P .string "This is a loop": w6 u/ l' B8 q3 t
.text: C/ ]0 ]6 l& f
.globl main
! S5 _% n( q4 T7 g3 K, c! w .type main, @function
) t) T1 p. L6 R/ ~main:
) c5 |7 g  k+ d3 B7 s.LFB0:( V# [; o9 h. U& }8 H
.cfi_startproc
+ }5 f5 Q! `: m/ \# S! f( k% K pushq %rbp6 `* F, p6 N$ k6 l/ n
.cfi_def_cfa_offset 168 K$ w$ Y, C* R3 F, ?
.cfi_offset 6, -16
! Z' r  c9 r' y# ^ movq %rsp, %rbp
5 d, }8 {5 V" q  B+ z7 ] .cfi_def_cfa_register 6
  t; Z+ P0 Q6 r$ a" Z7 \5 z.L2:
. \( y/ J9 V; e  E4 q7 P0 d leaq .LC0(%rip), %rdi0 y8 O  y5 S( q9 J/ T7 D
call puts@PLT7 K; `8 j. p# \2 O+ P
jmp .L2
- Q, `% z# z' J" C& X' _) L9 V+ b- I$ h& ` .cfi_endproc% w3 Q% g. u2 x2 L
.LFE0:/ |, k7 S! \$ _7 o- s) S. q* e" g
.size main, .-main/ y4 ~, _# Y8 H1 E* m- k' U9 P
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
" F! J6 G6 s  _3 u3 _! o .section .note.GNU-stack,"",@progbits
* l7 s$ B" C  \/ k- X
" r6 M% T+ S- {' {* A

while.s

.file "while.c"3 D- o- j9 r" Y2 `
.text
# V: X) @0 c/ T) q3 n( G5 f .section .rodata
- ]- `( Y1 T8 W.LC0:+ m. r' b( p' G2 g. j; z- h% n; a
.string "This is a loop"% l3 K: H9 _) U; S
.text
  l8 v  h2 j, v3 `' o7 J .globl main
' G8 _1 @3 l2 h; E6 y9 {5 Y .type main, @function. N: L" q& m* y- I0 B
main:8 Q1 @: ]* A1 B0 q1 A+ G
.LFB0:5 y( z3 ]( I: s3 o% K: @
.cfi_startproc4 r$ s) W% r# X0 N
pushq %rbp2 X. m$ U. [: }; M4 A: ]2 O7 O
.cfi_def_cfa_offset 165 g+ Y1 W0 P5 a
.cfi_offset 6, -16( {2 W$ i7 p" a
movq %rsp, %rbp4 u5 j+ z9 I) Y! |) M
.cfi_def_cfa_register 63 `& E- O- D; I) u7 x0 G
.L2:, T, ^7 p* w3 c
leaq .LC0(%rip), %rdi8 t  |: @* N5 x) h. N/ u
call puts@PLT# |3 r8 a6 E8 U) u
jmp .L25 a1 o8 w. [: H; J, ^
.cfi_endproc1 m& ?& j; L. n! _
.LFE0:
0 _+ m) f* O. p" U .size main, .-main
$ C; B3 Q8 Y1 t# T& K$ ^9 C4 N& ~6 S5 c .ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"( Q7 X- u( K. F
.section .note.GNU-stack,"",@progbits
: v& g  h3 ]0 y+ ^1 c
4 E5 Q; Y$ Q, q# i4 f. X9 u

goto.s

.file "goto.c"5 S" T! m1 F2 B( J3 Z
.text4 k4 X( N* X# R8 |4 ?1 i
.section .rodata: _- E  N# {$ n7 a' i- E/ s
.LC0:
) K1 \4 V: t! u: D& T# A$ J .string "This is a loop"' [4 ^: ?& h: _: u; {+ L+ P" z
.text
7 Q3 D7 m0 K4 z& E# f( y- } .globl main& O( F$ K7 M/ K+ I& E0 [
.type main, @function. ]9 c3 n' a* X5 e
main:
: ~$ K* J3 @2 ?; h/ H# Y% \- v.LFB0:
7 a! O1 U3 f6 x8 g: U .cfi_startproc/ C, I# G# n# H
pushq %rbp8 V; R. b* R0 q, p
.cfi_def_cfa_offset 16) `2 p% E* \4 B# G4 r0 t
.cfi_offset 6, -16
, F: M+ q' O  |& f; ~+ n movq %rsp, %rbp
5 a( [% O+ w6 g' @; b3 c9 L$ G. c2 U6 @ .cfi_def_cfa_register 6
& c/ t% j; T% C/ T! [.L2:. k% d6 n6 u" p. K, U' ^& X
leaq .LC0(%rip), %rdi
! v! D( }; V7 K, _ call puts@PLT
. e8 ?) Y3 t" M! ] jmp .L2
+ c% H* m, S4 Y- q# O: x% W .cfi_endproc
9 Q: l: k  S! }9 f! J; B.LFE0:
2 Q: t( ^/ i0 ?& \ .size main, .-main8 R" C4 J$ N4 G* {
.ident "GCC: (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0"
9 F3 o  a! U5 B: D% p4 p .section .note.GNU-stack,"",@progbits
& z) H5 M/ \3 ^( z& W2 Y4 Z( Q
7 f. `- W8 @6 X5 A) F5 m

gcc 版本

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
# ?: h. p; G6 h, F. gCopyright (C) 2017 Free Software Foundation, Inc.4 k4 b  R6 @4 w1 P
This is free software; see the source for copying conditions.  There is NO
/ \8 ^, E# W8 E0 Z0 M" }* a: o' u" D( ?- uwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
: \' Y$ w" c2 I1 V, x) l8 F; i

在上面测试结束后,我还特意打开了我的keil软件,结果发现两个生成的机器码都是一样的。

所以说,如果在项目中遇到这样的写法,就不要再感觉奇怪了,他们都是没啥问题的。

只不过for(;;)看起来更优雅一些。

微信图片_20210128144518.png

还有一种情况while(1)里面的1是一个常量,在一些编译器中,设置的检查规则比较高的话,会提示一个警告,for(;;)就不会存在这种问题,因为里面就没有变量,也没有常量。

: C. @2 _) \  z9 M1 [: M( \) X
赞 收藏 评论0 发布时间:2021-1-28 14:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版