关于while循环的表达式

时间:2018-03-22 12:59:20

标签: c while-loop post-increment postfix-operator

假设我> 0是真的。 为什么这个表达式:

while(i > 0) {
  printf("Hello \n);
  i--;
};

等于这个表达式:

 while(i--) {
  printf("Hello \n");
};

2 个答案:

答案 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--;
};