在 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
是否。这是预减量。 先减值再检查。
这里,i
是 char
,大小是 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型变量啥情况下不能互换,请举个例子说明(详细点)