C++ 一个无符号字符循环将运行多少次

C++ 一个无符号字符循环将运行多少次,c++,c,for-loop,C++,C,For Loop,我是C/C++的noob,所以请原谅这个问题的简单性,但这里是 unsigned char i; for (i=0; i<1000; ++i) if ((i%4) == 0) printf("hello\n"); 无符号字符i; 对于(i=0;i我敦促您通过运行代码来进行一个实验。如果这还不能解决问题,请尝试打印出条件为真的i的值。如果您随后注意到i的值如何变化的任何异常,请考虑可能的原因。注意:我假设为8位char类型 当对i执行等于255的++i时,将溢出。此时,语言标准

我是C/C++的noob,所以请原谅这个问题的简单性,但这里是

unsigned char i;
for (i=0; i<1000; ++i)
  if ((i%4) == 0)
    printf("hello\n");
无符号字符i;

对于(i=0;i我敦促您通过运行代码来进行一个实验。如果这还不能解决问题,请尝试打印出条件为真的
i
的值。如果您随后注意到
i
的值如何变化的任何异常,请考虑可能的原因。

注意:我假设为8位char类型

当对
i
执行等于255的
++i
时,将溢出。此时,语言标准规定
i
变为0,这是一种通常称为环绕的现象


所以,您有一个无限循环,因为答案是无限时间,无符号字符的范围在0-255(1字节)之间,当超过255时,它将溢出并返回到0,这意味着它永远不会达到1000。因此无限循环

我说0-它不是“你好”,而是“你好”:

但现在在real中:
i
的值为0、1、2、…999。这是1000个值

何时打印字符串?如果
i
为0、4、8、12,…-则每4个循环周期打印一次

-->在1000个循环中,它被打印250次

如果数据类型不使用
无符号字符
,则为真。

无限时间“hello”打印因为原因很简单,无符号字符的上限是255,之后如果你再增加它,它们将变为零&再次达到255,然后变为零,所以变量i永远不会达到1000,我们称之为无限循环。

这里你将“i”清除为无符号字符,其范围小于1000,大小为1字节(0-255)当它再次达到255时,它会递减,然后在任何情况下,该值都不会超过1000 bcoz“i”,范围仅为0-255

因此for循环不会失败,n将不确定地执行


我希望你明白我的意思了……!!!!!!!!!!!

无限,不是吗?字符的一般范围只有256,所以总是<1000。代码甚至不会编译,更不用说打印任何东西了。显示的代码片段中有4个
和3个
。请阅读更多关于
无符号字符的信息:-1以补偿错误答案的错误投票;-)溢出
无符号字符
并不是未定义的行为,但在其他方面答案是正确的。如果
UCHAR\u MAX
等于
INT\u MAX
,我想你会得到UB,但那将是一些奇怪的实现。哈!你需要投5次反对票来补偿我的反对票:P@Steve很抱歉行为的标准定义是什么?“我也可以学到一些东西。”戴维:在C++和C中,将一个超出范围的值转换为一个无符号类型会导致值Mudio uWuViFuxMax + 1。在这种情况下,如果
无符号字符
为8位,则模256。那么UB的可能性很小,如果
i+1
被提升到
int
并在它有机会被模块化回
无符号字符范围之前溢出@David:我假设没有证据表明这是从时间的黎明开始考虑的硬件问题——或者是某台机器捕捉到了越界的有符号算术,但没有无符号,或与符号大小表示有关(其中,
INT\u MAX+1
的溢出有符号值不能用模
2*(INT\u MAX+1)
表示)。公认的答案明确说明了假设是关于8位字符的。