在C中对char变量进行后/预递减时,这里发生了什么

在C中对char变量进行后/预递减时,这里发生了什么,c,char,C,Char,我在解一本书中的多项选择C代码。其中两个问题涉及对初始化为0的char变量进行预减量和后减量。两者的输出非常不同。我不明白那里发生了什么事 代码1 char i=0; do { printf("%d ",i); }while(i--); return 0; 此代码段的输出为0 代码2 char i=0; do { printf("%d ",i); }while(--i); return 0; char i=0; do { printf("%d ",i); //

我在解一本书中的多项选择C代码。其中两个问题涉及对初始化为0的char变量进行预减量和后减量。两者的输出非常不同。我不明白那里发生了什么事

代码1

char i=0;
do
{
    printf("%d ",i);
}while(i--);
return 0;
此代码段的输出为0

代码2

char i=0;
do
{
    printf("%d ",i);
}while(--i);
return 0;
char i=0;
do
{
    printf("%d ",i);     //print 0
}while(--i);             //decrement i, check i=-1, means true, next cycle, loop until i = 0 which means false
return 0;
此项的输出为
0,-1,-2,…-128127126,….1

有人能解释为什么会发生这种情况吗?

  • i
    的初始值为
    0
  • 在代码1中,首先执行while检查,其中使用i=0)的值,然后i递减,因为它是后缀递减。因此它在打印
    0
    后退出
    
    
  • 在代码2中,因为它是前缀递减,所以首先递减i,并且在执行while检查时使用其值(=-1)。在这里,它在打印
    有符号字符
    可以保存的整个值范围后退出,因为它仅在末尾变为
    0
      • i
        的初始值为
        0
      • 在代码1中,首先执行while检查,其中使用i=0)的值,然后i递减,因为它是后缀递减。因此它在打印
        0
        后退出
        
        
      • 在代码2中,因为它是前缀递减,所以首先递减i,并且在执行while检查时使用其值(=-1)。在这里,它在打印
        有符号字符
        可以保存的整个值范围后退出,因为它仅在末尾变为
        0

      在循环检查
      i==0
      与否时,在两个代码
      处进行检查。如果
      i=0
      它将继续运行

      最初
      i
      的第一个代码值
      0
      。因此,在打印
      0
      之后,它会检查
      i==0
      。如果
      i==0
      它将中断循环或通过减小
      i
      继续进行。因此,在代码1中,使用了后期递减首先检查值,然后递减值

      在第二个代码值
      i
      时,最初
      0
      。因此,在打印
      0
      之后,它将
      i
      递减,然后检查
      i==0
      与否。它是预减量先减小值,然后检查。


      这里,
      i
      char
      ,大小是
      1字节
      ,范围是
      -128到127。因此,在将值
      0
      减至
      -1
      后,它将继续减至
      0
      并通过打印0、-1、-128127…1退出循环

      在循环检查
      i==0
      或不检查时,在两个代码
      处。如果
      i=0
      它将继续运行

      最初
      i
      的第一个代码值
      0
      。因此,在打印
      0
      之后,它会检查
      i==0
      。如果
      i==0
      它将中断循环或通过减小
      i
      继续进行。因此,在代码1中,使用了后期递减首先检查值,然后递减值

      在第二个代码值
      i
      时,最初
      0
      。因此,在打印
      0
      之后,它将
      i
      递减,然后检查
      i==0
      与否。它是预减量先减小值,然后检查。

      这里,
      i
      char
      ,大小是
      1字节
      ,范围是
      -128到127。因此,在将值
      0
      减至
      -1
      后,它将继续减至
      0
      并通过打印0、-1、-128127…1退出循环

      代码1

      char i=0;
      do
      {
          printf("%d ",i);
      }while(i--);
      return 0;
      
      char i=0;
      do
      {
          printf("%d ",i);    // print o
      }while(i--);           //check i = 0, means false, loop ends, then increment i
       return 0;
      
      代码2

      char i=0;
      do
      {
          printf("%d ",i);
      }while(--i);
      return 0;
      
      char i=0;
      do
      {
          printf("%d ",i);     //print 0
      }while(--i);             //decrement i, check i=-1, means true, next cycle, loop until i = 0 which means false
      return 0;
      
      代码1

      char i=0;
      do
      {
          printf("%d ",i);
      }while(i--);
      return 0;
      
      代码2

      char i=0;
      do
      {
          printf("%d ",i);
      }while(--i);
      return 0;
      
      char i=0;
      do
      {
          printf("%d ",i);     //print 0
      }while(--i);             //decrement i, check i=-1, means true, next cycle, loop until i = 0 which means false
      return 0;
      
      i--
      --i
      都是表达式。表达式是可以产生值的语句的一部分。根据定义,预增量版本首先递增,然后生成值。对于增量后版本,情况正好相反

      这完全独立于表达式是在
      while
      语句中使用还是在其他地方使用。但是,在使用此类表达式时,您需要注意。

      无论是
      i--
      还是
      --i
      都是表达式。表达式是可以产生值的语句的一部分。根据定义,预增量版本首先递增,然后生成值。对于增量后版本,情况正好相反

      这完全独立于表达式是在
      while
      语句中使用还是在其他地方使用。但是,在使用这些表达式时,您需要注意