尝试打印所有 ASCII 值时无限循环

Infinite Loop when trying to print all the ASCII values

当我尝试打印所有 128 个 ASCII 值时,我似乎进入了一个无限循环,但我不明白为什么。题目要求我编写一个程序,使用循环显示 ASCII 码 0 到 127 的字符,并在每一行显示 16 个字符。我尝试使用 for 循环并告诉程序在我的 char 变量超过 127 时停止循环,但由于某种原因我最终得到了一个无限循环。我什至写了一个 if 语句,告诉循环在 char 变量超过 127 时中断,但这似乎也不起作用。这是我的代码,任何反馈将不胜感激,谢谢。

#include <iostream>
using namespace std;

int main() {
    char a;

    for (char a = 0; a <= 127; a++)
    {
        cout << a << " ";
        if (a % 16 == 0)
            cout << endl;
        if (a > 127)
            break;
    }
    return 0;
}

你的 char 类型几乎肯定是有符号的(C/C++ 允许 char 有符号或无符号 (a) ) 因此,当您将一个添加到 127 时,它会环绕到 -128(实际上不是标准 强制执行的 ,而是常见的行为)。

因此总是小于或等于127

您可以使用以下代码进行测试:

#include <iostream>
using namespace std;

int main() {
    char x = 127;
    x++;
    cout << (int)x << endl;
    return 0;
}

如果是这种情况,只需使用 unsigned char 而不是 char


这里有一些代码可以完成这项工作,同时也只打印出特别标记为可打印的字符:

#include <iostream>
using namespace std;

int main() {
    unsigned char a = 0;
    while (a < 128) {
        if (isprint(a)) {
            cout << a << " ";
        } else {
            cout << ". ";
        }
        if (++a % 16 == 0) {
            cout << endl;
        }
    }
    return 0;
}

结果是:

. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
  ! " # $ % & ' ( ) * + , - . /
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
@ A B C D E F G H I J K L M N O
P Q R S T U V W X Y Z [ \ ] ^ _
` a b c d e f g h i j k l m n o
p q r s t u v w x y z { | } ~ .

(a) 来自 C++ 17, basic.fundamental:

a plain char object can take on either the same values as a signed char or an unsigned char; which one is implementation-defined.

你的问题是 char 数据类型的范围是 -128 到 127。这也意味着当你到达 a = 127 然后 a++,它循环回到a = -128 然后继续。因此,当您查看 a <= 127 的条件时,它将始终为真。一种选择可能是制作无符号类型

char是赋值符号, 所以 a + 128 = a

这意味着当 a == 127 时,a++ 给你 128 -> a = 0 所以条件仍然为真

你可以用=修复它 如果 (a >= 127) 中断;

或使用 do {} while (a != 127)