cin和赋值之间的区别

时间:2011-07-13 07:17:52

标签: c++

考虑以下两个代码段:

案例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失败了。我想知道的是:为什么cin在输入char时失败,如果赋值正确分配了ascii值?

5 个答案:

答案 0 :(得分:5)

如果您输入'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”

答案 1 :(得分:2)

如果您想获取从cin读取的角色的ASCII码,请稍后阅读char并投射到int

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

答案 2 :(得分:2)

当用户输入'a'时,运算符实现会尝试将其转换为整数,然后失败。

回应评论(这似乎是你问题的主要观点):

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

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

但是cin不知道字符文字是什么。就cin而言,用户输入了以下内容:

const char* inputValue = "'a'";

cin不是C ++编译器。它简单得多,你可能会说愚蠢。当你告诉它以整数形式流时,它将以整数(并且只是整数)流式传输。如果该整数恰好对应于ASCII表中的字符,那么就是这样,但用户必须将其输入为85

流输入操作符“愚蠢”的事实实际上是一件好事,因为:

  • 他们执行得更快
  • 有经验的程序员更容易理解引擎盖下的内容
  • 您可以确定用户输入的数字(更少的错误)

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

答案 3 :(得分:1)

在第一个示例中,您调用operator&lt;&lt;值类型为“int”。 char c='a';在c中你有一个符号。当你调用i=a;时,我现在是符号的ASCII码(从char转换为int)。所以cout&lt;&lt;我输出ASCII码。

在第二个例子中 - 整数,当你调用cin >> i时,它想要读取整数。要阅读某些字符,您可以像这样使用smth

char c;
cin >> c;

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

答案 4 :(得分:0)

我认为它失败的原因是cin >>试图为你格式化;所以,如果你在stdin上输入“10”(字符串),它就能将它放入int中。如果您输入“a”并尝试将其放入int,则会出错,因为“a”不是有效数字。

考虑使用cin >>作为输入格式而不使用格式字符串并使用更强大的错误处理;就像scanf一样,当你将“%s”传递给它时,如果你试图使用int作为变量来获取你的字符串参数,则会失败。