关于#c语言#的问题:无符号变量参与循环,为什么没有进入死循环?


#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char *argv[]) {
    unsigned char n;
    int total;
    n = 50;
    while(n-->0)
    {
       total += n;
    }
    return 0;
}

代码如上
变量n是无符号字符,当n为0时,进入循环,后执行n--,还是大于0,通过dev++调试,显示变成255,但是没进入循环,程序结束了,为什么呢?

while(n-->0)
改成
while(n-->=0)
就死循环了


#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
    int n; // 使用有符号整数来表示 'n'
    int total = 0; // 将 'total' 初始化为 0
    n = 50;
    while(n-- > 0) // 在这里使用前置递减
    {
       total += n;
    }
    printf("Total: %d\n", total);
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7563248
  • 这篇博客你也可以参考下:给定n个数,每个都可以使用无数次,用这些数的和 是否可以组成一个给定的数字
  • 除此之外, 这篇博客: 用随机数实现插入排序算法,并计算程序运行时间中的 插入排序n的数量和程序运行时间的关系 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    问题中的代码是一个简单的循环,当无符号字符变量n为0时,执行n--操作,然后判断条件n>0是否成立,如果成立就继续执行循环体,否则结束循环。在这个代码中,由于n是无符号字符变量,它的取值范围是0到255,所以当n为0时,执行n--操作之后,n的值会变为255。但是由于循环条件是n>0,所以循环条件不成立,循环体不会执行,所以程序就结束了。

    如果你想让循环执行,可以修改代码中的循环条件为n>=0,这样即使n为0,经过n--操作后,n的值变为255,循环条件仍然成立,循环体会执行一次。以下是修改后的代码:

    #include <stdio.h>
    
    int main() {
        unsigned char n = 0;
    
        while (n >= 0) {
            n--;
        }
    
        printf("n = %d\n", n);
    
        return 0;
    }
    

    这样修改之后,循环体会执行一次,输出结果为n = 255。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^