cin和作业之间的差异

Diffrence between cin and assignment

本文关键字:之间 作业 cin      更新时间:2023-10-16

考虑以下两个代码片段:

案例1:

#include <iostream>
int main()
{
    int i=0;
    char c='a';
    i=c;
    cout << i << endl; //Retuens ASCII value of 'a'
    return 0;
}

案例2:

#include <iostream>
int main()
{
    cout << "Enter integer value" << endl;
    int i=-1;
    cin >> i; //Assume user enters 'a'
    cout << i << endl; //prints -1 on screen
    return 0;
}

在情况1中,当我们使用赋值时,'a'的ASCII等价物被赋值给int i,但在情况2中,int i-1。为什么两种情况下的行为不同?它是故意的吗?当为整数变量输入字符时,是否可以(使用标准函数(使用cin输入ASCII值?

//我知道cin正在失败。我想知道的是:如果赋值正确地分配了ascii值,为什么cin在输入char时失败?

如果输入'a',则cin >> i失败,因为i的类型为int。所以它打印的只是垃圾值。

你可以通过写以下内容来检查:

if ( cin >> i )
{
   cout << i << endl; //on successful read this will be printed!
}
else
{
   cout << "cannot read 'a' from input stream";
}

它将打印以下内容:

无法从输入流读取"a">

当用户输入'a'时,运算符实现试图将其转换为整数,但失败了。

回复评论(这似乎是你问题的要点(:

是的,我知道cin正在失败。我想知道的是:如果赋值正确地分配了ascii值,为什么cin在输入char时失败?

'a'不是"ASCII值"。在C语言中,它是一个字符文字。

但是cin不知道文字是什么。据cin所知,用户输入了以下内容:

const char* inputValue = "'a'";

cin不是C++编译器。它要简单得多,你可能会争论得更愚蠢。当你告诉它以整数进行流式传输时,它将以整数(并且只有一个整数(进行流式处理。如果该整数恰好对应于ASCII表中的一个字符,那就顺其自然,但用户必须将其输入为85

流输入运算符"愚蠢"的事实实际上是一件好事,因为:

  • 他们执行得更快
  • 对于一个有经验的程序员来说,了解引擎盖下发生的事情更简单
  • 你可以确信用户输入了一个数字(更少的bug(

流输入操作符(>>(不仅仅用于控制台输入。它们还用于文件输入,这需要快速、安全。

如果您想获得从cin读取的字符的ASCII代码,只需读取到char中,然后转换为int即可:

char c;
if(cin >> c) {
    cout << static_cast<int>(c) << std::endl;
}

在第一个例子中,您调用运算符<lt;值类型为"int"。char c='a';在c中有一个符号。当您调用i=a;时,我现在是符号的ASCII代码(从char转换为int(。所以cout<lt;i输出ASCII代码。

在第二个例子i-integer中,当您调用cin >> i时,它想要读取integer。要读取某些字符,您可以使用类似的smth

char c;
cin >> c;

现在,c中的代码将是您的输入字符

我相信它失败的原因是cin >>试图为您格式化;因此,如果你在stdin上输入"10"(字符串(,它将能够将其放入int。如果你输入"a"并试图将其放入int,它会给出一个错误,因为"a"不是一个有效的数字。

cin >>更多地看作是在没有格式字符串和更稳健的错误处理的情况下进行输入格式化;就像一个scanf,当您将"%s"传递给它时,如果您试图使用int作为变量来获取字符串参数,它将失败。