假设我> 0是真的。 为什么这个表达式:
while(i > 0) {
printf("Hello \n);
i--;
};
等于这个表达式:
while(i--) {
printf("Hello \n");
};
答案 0 :(得分:4)
首先,这不是表达。它是一个package main
import (
"fmt"
"strings"
)
func main() {
input := "test1, test2, test3"
slc := strings.Split(input , ",")
for i := range slc {
slc[i] = strings.TrimSpace(slc[i])
}
fmt.Println(slc)
}
循环。而且,他们并不平等。 while
相当于while(i--)
,它会检查不等式,而不是大于。
如果while(i-- != 0)
在开头大于或等于i
,则两个代码段的行为方式都相同。
答案 1 :(得分:-1)
很明显,你的意思是循环执行的等价性。它们是等价的,因为变量i
未在循环体中使用,并且假设i
是正数。
然而,循环在逻辑上看起来如下
while(i > 0) {
printf("Hello \n);
i--;
};
和
while( int temp = i; i -= 1; temp > 0 ) {
printf("Hello \n");
};
虽然while循环的第二个结构无效,但它表明变量i
在任何情况下都会被改变,无论条件是假还是循环的每次迭代之前。
考虑以下示范程序及其输出。
#include <stdio.h>
int main(void)
{
int i = 1;
puts( "The first loop" );
while ( i > 0 )
{
printf("%d: Hello\n", i );
i--;
}
putchar( '\n' );
i = 1;
puts( "The second loop" );
while ( i-- )
{
printf("%d: Hello\n", i );
}
putchar( '\n' );
i = 0;
while ( i > 0 )
{
printf("%d: Hello\n", i );
i--;
}
printf( "After the first loop i = %d\n", i );
putchar( '\n' );
i = 0;
while ( i-- )
{
printf("%d: Hello\n", i );
i--;
}
printf( "After the second loop i = %d\n", i );
return 0;
}
程序输出
The first loop
1: Hello
The second loop
0: Hello
After the first loop i = 0
After the second loop i = -1
考虑到在第一个循环的条件下,检查变量i
是否大于0,而在第二个循环的条件下,检查变量i
是否不是等于0.所以进入循环体的条件是不同的。
如果i
具有无符号整数类型,或者保证i
不能为负数,则以下循环将完全等效
while(i > 0) {
printf("Hello \n);
i--;
};
和
while(i != 0) {
printf("Hello \n);
i--;
};