我正在学习 C++ 中的隐式转换。我读了下面的例子:
char a;
std::cin>>a; //I can enter an integer like 56 here
std::cout<<a<<std::endl; //for the input 56 it will display 5 because of its ASCII value
我通过阅读不同的书籍和帖子来理解上面的例子。例如,如果我提供输入J
,然后程序成功打印J
在控制台上。同样,如果我提供输入说56
那么输出将是5
因为它的 ASCII 值。
但后来我尝试了相反的方法,如下所示:
int a;
std::cin>>a;//if i provide the input as the character J then why is the output 0 instead of the corresponding code point of `J`
std::cout<<a<<std::endl;
对于上面的代码片段,如果我提供输入56
那么输出被正确打印为56
。但如果我提供的输入为J
那么output is 0
.
所以我的问题是在上面的第二个片段中为什么代码点对应于字符J
没有打印出来,而是我们得到0
打印在控制台上。我是说,a
是一个整型变量,因此它能够存储与字符对应的代码点J
然后当我们这样做时cout<<a;
我们应该将该代码点作为输出而不是0
。这里发生了什么。这是否与隐式转换有关,例如char
可以晋升为int
或者是其他东西。
user4581301的评论指出了正确的方向。
人们需要更好地了解提取运算符(运算符>>)才能理解发生了什么。
当分配给算术类型时,只要字符序列可以准确地解释为该类型的值,就会逐个字符地解析输入。当不再可能这样做时,解析停止并使用直到该点为止获得的有效值。
因此,当只输入一个字符并将该字符的 ASCII 值赋给一个整型变量时,不存在隐式转换的问题。相反,这是一次失败,人们可以在std::num_get<CharT,InputIt>::get
下面列出了链接。
如果转换函数无法转换整个字段,则
值0 存储在 v 中。
以下是广泛了解该主题的好地方:
std::cin 和处理无效输入
std::istream::运算符>>
为了更深入地理解,以下链接很有用:
运算符>>(std::basic_istream)
std::basic_istream::operator>>
std::num_get::get、std::num_get::do_get
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)