解释以下输出[重复]

Posted

技术标签:

【中文标题】解释以下输出[重复]【英文标题】:Explain the following output [duplicate] 【发布时间】:2017-09-22 09:27:18 【问题描述】:
#include <stdio.h>
int main() 
    unsigned char var = -100;
    for(var = 0; var <= 255; var++)
       printf("%d ", var);
    

输出附在下面(在代码块 IDE 版本 16.01 上运行)

为什么输出是一个无限循环?

【问题讨论】:

指望手指的时候,n &lt;= 10可以是假的吗? 与“pacman killscreen”相同的错误:) unsigned char 的范围是 0 到 255 在这里它被分配到 -100 。那么为什么无限循环应该是一个错误? 我想你的意思是for(var=0;var&lt;255;var++) 另外,"%d" 格式说明符用于有符号整数,因此带有unsigned charprintf("%d ",var); 是正式未定义的行为。从理论上讲,这可能导致无限循环或其他原因。 【参考方案1】:

假设CHAR_BIT 在您的平台上为 8,unsigned char 的条件 var &lt;= 255 始终为真。所以循环是无限的,因为增量会导致变量换行(这就是无符号算术在 C 中所做的)。

这个初始化:

unsigned char var = -100;

不是错误,它只是烦人的代码。编译器会将int -100 转换为unsigned char,遵循语言规范中的规则。

【讨论】:

【参考方案2】:

您使用的是unsigned char,它的可能范围是 0-255。

您正在从 0-255(含)运行您的循环。当您的变量变为 256 时,它将被转换回 0。此外,由于这个可能的范围,初始值 -100 将被视为 +156。

所以,这会导致无限循环。

【讨论】:

我错了:“涉及无符号操作数的计算永远不会溢出,因为无法由生成的无符号整数类型表示的结果会以比最大可以计算的值大一的数字为模减少由结果类型表示。”来自标准:***.com/questions/18195715/…。它是为 signed 类型定义的实现。【参考方案3】:

因为unsigned char overflow的问题。因此,在 for 循环条件中删除 =

for(var=0;var<255;var++)


有关详细信息,请参阅此stack overflow 问题。

【讨论】:

@Jean-FrançoisFabre 我做了更正。【参考方案4】:
    unsigned char

范围是 0 到 255。当 var = 255。当它增加时,我们得到的值为 256,它不能存储在 unsigned char 中。这就是它以无限循环结束的原因。当你将 var 初始化为 - 100.它不会显示任何错误,因为它将-100转换为二进制并取第一个八位。对应的值将是var的值

【讨论】:

以上是关于解释以下输出[重复]的主要内容,如果未能解决你的问题,请参考以下文章

程序输出解释HashSet [重复]

在javascript中添加两个空白对象或空白数组[重复]

Python比较怪异[重复]

最长不重复字符串

无重复字符的最长子串

无重复字符的最长子串