我的问题是,如果我在循环外声明一个变量并在循环内每次重新初始化或在循环内声明和初始化,这是否重要?所以基本上这两种语法(性能,标准等)之间有什么区别吗?
int a,count=0;
while(count<10)
a=0;
int count=0;
while(count<10)
int a=0;
请假设这只是更大程序的一部分,并且body循环内部要求变量a
每次都有0
的值。那么,这两种方法的执行时间会有什么不同吗?
答案 0 :(得分:5)
是的,这很重要。在第二种情况下
int count=0;
while(count<10)
int a=0;
a
无法在while循环中引用。它有块范围;程序文本中可以引用变量的部分
Jonathan Leffler在answer中指出的另一件事是这两个循环都是无限循环。第二,最重要的第二个片段在没有{}
(在C中)的情况下不能编译,因为变量定义/声明不是一个语句,不能作为循环的主体出现。
int count =0;
while(count++ < 10)
{
int a=0;
}
答案 1 :(得分:3)
此
void f1(void)
{
int a, count = 10;
while (count--)
a = 0;
}
void f2(void)
{
int count = 10;
while (count--)
{
int a = 0;
}
}
结果(使用非优化gcc(Debian 4.4.5-8)4.4.5):
.globl f1
.type f1, @function
f1:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl $10, -4(%rbp)
jmp .L2
.L3:
movl $0, -8(%rbp)
.L2:
cmpl $0, -4(%rbp)
setne %al
subl $1, -4(%rbp)
testb %al, %al
jne .L3
leave
ret
.cfi_endproc
.LFE0:
.size f1, .-f1
.globl f2
.type f2, @function
f2:
.LFB1:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
movq %rsp, %rbp
.cfi_offset 6, -16
.cfi_def_cfa_register 6
movl $10, -8(%rbp)
jmp .L6
.L7:
movl $0, -4(%rbp)
.L6:
cmpl $0, -8(%rbp)
setne %al
subl $1, -8(%rbp)
testb %al, %al
jne .L7
leave
ret
.cfi_endproc
.LFE1:
.size f2, .-f2
汇编代码看起来很安静。
答案 2 :(得分:1)
第一次编译;第二个没有。第一次运行了很长时间。
如果第二个是:
int count = 0;
while (count++ < 10)
{
int a = 0;
...do something with a...
}
并且您也进行了类似的更改并在第一个循环中使用a
执行了某些操作,然后不同之处在于,在第二种情况下,每次循环迭代时a
都设置为零,但它在第一种情况下保存它在循环中设置的任何值。此外,在第二种情况下,变量a
不存在于循环之外,因此在循环之后不能被引用。
答案 3 :(得分:0)
是的,在你的第一种方法中,对于下一个更大的计划,它是零。
虽然在方法2中,在进一步的语句中无法访问相同的“a”。如果是这样会产生错误,因为对变量'a'的未定义引用。它对于循环寿命来说是零,但在循环之后却没有。你可以在while循环之后再次定义变量'a'。