在 C 中 post/pre 递减 char 变量时发生了啥 [重复]

Posted

技术标签:

【中文标题】在 C 中 post/pre 递减 char 变量时发生了啥 [重复]【英文标题】:What is happening here while post/pre decrementing a char variable in C [duplicate]在 C 中 post/pre 递减 char 变量时发生了什么 [重复] 【发布时间】:2019-04-24 19:15:26 【问题描述】:

我正在解决书中的一些多项选择 C ​​代码。其中两个问题涉及预递减,后递减初始化为 0 的 char 变量。这两个问题的输出非常不同。我不明白那里发生了什么。

代码 1

char i=0;
do

    printf("%d ",i);
while(i--);
return 0;

这个 sn-p 的输出是 0。

代码 2

char i=0;
do

    printf("%d ",i);
while(--i);
return 0;

输出是这个 0,-1,-2,.....-128,127,126,......1.

谁能解释为什么会这样?

【问题讨论】:

【参考方案1】: i 的初始值为0。 在代码 1 中,首先进行while 检查,其中使用i (= 0) 的值,然后减少i,因为它是后缀减量。所以它在打印0 后退出while。 在代码2中,因为是前缀递减,所以i先递减,在进行while检查时使用其值(= -1)。在打印出signed char 可以容纳的整个值范围后,它在此处退出,因为它仅在末尾变为0

【讨论】:

【参考方案2】:

在两个代码while 循环检查i==0 与否。如果i!=0它将继续。

i 的第一个代码值最初是 0。所以在打印0 之后,它会检查i==0 与否。如果i==0 它将打破循环或通过递减i 继续进行。所以在代码 1 中使用了递减。 先检查值,然后递减值

i 的第二个代码值最初是0。所以在打印0 之后它会减少i 然后它检查i==0 是否。这是预减量。 先减值再检查。

这里,ichar,大小是 1 byte,范围是 -128 to 127。因此,在将值 0 递减到 -1 后,它会继续递减,直到达到 0 并通过打印 0,-1,...,-128,127...1 退出循环。

【讨论】:

【参考方案3】:

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

这与表达式是在while 语句还是其他地方使用完全无关。但是,在使用此类表达式时,您需要注意operator precendence。

【讨论】:

【参考方案4】:

代码 1

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);     //print 0
while(--i);             //decrement i, check i=-1, means true, next cycle, loop until i = 0 which means false
return 0;

【讨论】:

以上是关于在 C 中 post/pre 递减 char 变量时发生了啥 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中 int型变量与char型变量啥情况下不能互换,请举个例子说明(详细点)

在C语言中,unsigned char是啥类型

在 C 中打印 char 变量不能正确显示

C语言中的char具体用法

如何在 foreach 循环中为 char 变量赋值? C#

c++ 中char&的理解