2011-07-13 43 views
1

考慮以下2個的代碼片段:Diffrence

案例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中,當我們使用賦值ASCII等效的'a'被分配給int i,但是在情況2中int i-1。爲什麼這兩種情況下的行爲不同?它是否由設計?輸入字符時,使用cin是否可以(使用標準功能)輸入ASCII值,用於整型變量?

//我明白cin失敗了。我想知道的是:爲什麼cin在輸入char時失敗,如果賦值正確指定ascii值?

+3

良好的格式是你的朋友 –

+0

看來'cin'流會失敗,所以'我'不會受到影響。你有沒有'cin'的錯誤狀態? – Kyle

+0

是的,我知道cin失敗了。我想知道的是:爲什麼cin在輸入char時失敗,如果賦值正確指定ascii值? – Yogesh

回答

2

當用戶輸入'a'時,運算符實現嘗試將其轉換爲整數,並失敗。

針對註釋(這似乎是你的問題的要點):

是的,我明白,CIN是失敗的。我想知道的是:爲什麼cin在輸入char時失敗,如果賦值正確指定ascii值?

'a'不是「ASCII值」。在C語言中,它是一個字符文字。

cin不知道字符文字是什麼。至於cin可以告訴,用戶輸入的此:

const char* inputValue = "'a'"; 

cin不是C++編譯器。這簡單得多,你可能會說很多愚蠢的東西。當你告訴它以一個整數流式傳輸時,它將以一個整數流(只有一個整數)。如果該整數恰好對應於ASCII表中的一個字符,那就這樣吧,但用戶必須輸入它作爲85

的流輸入操作符是「愚蠢的」,其實是一件好事,因爲事實:

  • 他們執行得更快
  • 這是一個有經驗的程序員瞭解引擎蓋下發生的事情更簡單
  • 您可以織補確保用戶輸入的數字(錯誤更少)

流輸入操作符(>>)不只是用於控制檯放。它們也用於文件輸入,它需要快速和安全。

+0

''a''是一個字符 - 它更像'char inputValue ='a''。另外,你應該提到賦值是有效的,因爲有從'char'到'int'的隱式轉換。 –

+0

@ Space_C0wb0y:一直在編輯,所以不確定char-literal部分是否仍然適用。讓我知道,我會解決我能做的事情:)我不會接受第二個建議,因爲我想我必須重做我的整個答案才能讓它流動。而我很懶惰:)至少它在這裏的評論。 –

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"; 
} 

它會打印:如果你想要得到的

不能 '一' 從輸入流

2

閱讀從cin讀取的字符的ASCII碼,剛剛讀入char,然後投射到int

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

在第一個示例中,您將值類型爲「int」的運算符< <稱爲。 char c='a';在c中你有一個符號。當你撥打i=a;我現在是符號的ASCII碼(從char轉換爲int)。所以我輸出ASCII代碼。

在第二個示例i - integer中,當您調用cin >> i時,它想要讀取整數。閱讀一些字符,你可以在C使用水木清華這樣

char c; 
cin >> c; 

現在將是你輸入字符的代碼

0

我認爲失敗的原因是cin >>嘗試爲您格式;所以,如果你在stdin上輸入「10」(字符串),它將能夠把它放到一個int中。如果輸入「a」並嘗試將其置於int,則會發出錯誤,因爲「a」不是有效的數字。

認爲使用cin >>更多作爲輸入格式沒有格式字符串和更健壯的錯誤處理;就像一個scanf,當你將「%s」傳遞給它時,如果你嘗試使用一個int作爲變量來獲取你的字符串參數,它將會失敗。