C++ 铸造不工作(gcc更新后?)

C++ 铸造不工作(gcc更新后?),c++,gcc,C++,Gcc,我不明白为什么下面的代码不起作用 #include <iostream> using namespace std; int main() { int i = 5; char a = i; char b = (char)i; cout << a << endl; cout << b << endl; return 0; } #包括 使用名称空间std; int main(){ int i

我不明白为什么下面的代码不起作用

#include <iostream>
using namespace std;

int main() {
    int i = 5;
    char a = i;
    char b = (char)i;
    cout << a << endl;
    cout << b << endl;
    return 0;
}
#包括
使用名称空间std;
int main(){
int i=5;
字符a=i;
字符b=(字符)i;

cout它可以工作,只是您的控制台没有任何输出供您观看,请查看代码:

int main() {
    int i = 5;
    char a = i;
    char b = (char)i;
    cout << a << endl;
    cout << b << endl;

    char a2 = i+48;
    char b2 = (char)i+48;

    cout << a2 << endl;
    cout << b2 << endl;
    return 0;
}
intmain(){
int i=5;
字符a=i;
字符b=(字符)i;

cout您要求计算机打印其字符表中的第5个字符。这是一个控制字符。控制字符很少有可见的输出;它们有一些其他含义,可能有用,也可能不再有用(一些,如字符#10和#13,非常有用)

如果需要打印数字5的字符,则必须使用“5”,或者可以强制转换值
'0'+5
(在ASCII中为)


也许你不明白强制转换是怎么做的。强制转换不一定按照你通常的思维方式转换数据。有些强制转换是这样做的(例如,
int
float
;有些则没有。您使用的强制转换只是将数据重新解释为不同的类型:在机器级别,它只是数值5。将其强制转换为
char
不会更改该数字的数据;它只是意味着输出系统将其视为ASCII表中的第5个字符,ins)而不是整数5。如果你想把它转换成字符
5
,那么你通常需要做一些工作(比如我上面提到的)。

你说“它不工作”是什么意思?您希望得到什么输出?为什么?我很有信心,此代码在gcc5和gcc8上的行为相同。强制转换工作正常。将数值
5
写入终端几乎肯定不会显示任何合理的结果;如果您的系统使用ASCII(它可能会这样做),5是非打印字符。请尝试使用值
'a'
初始化
i
a
b
的初始化实际上没有实际区别。两者都将使用整数值
5
初始化(根据例如,实际上是
ENQ
字符)为什么你希望代码“<代码> <代码>可打印<代码> CUT不清楚,因为:你问为什么更新会破坏程序,这从来就没有起作用。谢谢你的回答,我想我有麻烦从Python再次转换到C++;@Josja不客气。您的字符包含5个代码的符号,在ascii表中为(查询),要对可见数字进行偏移,您需要添加48。但不要忘记,从int到char的转换可能会导致溢出。转换告诉编译器进行转换。转换方式的详细信息取决于转换为什么。转换的一个可能效果是将值的位视为不同的类型;另一种可能是ble的作用是创建一组可能不同的位。请注意,该语言不会“[查看]它作为ASCII表中的第5个字符”;它将其视为值5。它是将数字值转换为字符标志符号的输出系统。@PeteBecker谢谢。我写得太草率了。我已经尝试过改进它,如果需要的话,我很乐意继续改进它。很抱歉这一系列的更正:对于从0到9的值,您可以通过添加
'0'
;不需要魔法值48(除了ASCII之外,它不一定是字符编码的正确值):-)我最初有
0
,但出于教学原因(基于该表!),最好将48。。。