1. 程式人生 > >cin>>i的返回值的問題

cin>>i的返回值的問題

  最近在看C++,學到了標準庫這一章,看到cin的時候,我們經常看到很多的程式碼中會有這麼一段while(cin>>x){ ......}。這裡我們最關注的問題是while括號裡面cin>>x他每次輸入的時候返回的是什麼值呢。所以我們也就會問cin的返回值是什麼。我也看到很多像我這樣的新手問這樣的問題,下面說下我個人的見解,如有不當之處,還請指正!

    其實我倒覺得我們這個問題問錯了,我們不應該問cin返回值是什麼,我覺得我們應該關注">>"輸入操作符,其實是它到底返回了什麼。因為cin是標準輸入istream的一個物件,一個物件能返回什麼嗎?物件有返回值嗎?好像沒有吧!在C++primer裡面講到過,cin>>x>>y。有這麼一行程式碼,我們討論下">>"這個輸入操作符,這個操作符接收一個istream物件作為其做運算元,接收一個物件作為其右運算元。">>"操作符返回其左運算元作為結果,這樣也就可以解釋為什麼上面可以將兩個輸入操作合併了。因為cin>>x返回cin物件,接著又可以進行cin>>y。所以我們就可以順利進行輸入了。所以我們再來看上面的那個while迴圈,裡面的cin>>x,返回的是cin物件(注意是輸入操作符“>>”返回),所以返回的也就可以認為是流本身了。我們再來看下他什麼時候退出迴圈。因為我們已經知道了括號裡面的返回值了,所以我們看看它什麼時候退出迴圈。

    輸入(cin)緩衝是行緩衝。當從鍵盤上輸入一串字元並按回車後,這些字元會首先被送到輸入緩衝區中儲存。每當按下回車鍵後,cin 就會檢測輸入緩衝區中是否有了可讀的資料,這種情況下cin對鍵盤上是否有作為流結束標誌CTRL+Z或者CTRL+D,其檢查的方式有兩種:阻塞式以及非阻塞式。這裡借用一點網上搜到的資料,

    阻塞式檢查方式指的是隻有在回車鍵按下之後才對此前是否有 Ctrl+Z 組合鍵按下進行檢查,非阻塞式樣指的是按下 Ctrl+D 之後立即響應的方式。如果在按 Ctrl+D 之前已經從鍵盤輸入了字元,則 Ctrl+D的作用就相當於回車,即把這些字元送到輸入緩衝區供讀取使用,此時Ctrl+D不再起流結束符的作用。如果按 Ctrl+D 之前沒有任何鍵盤輸入,則 Ctrl+D 就是流結束的訊號。
    阻塞式的方式有一個特點:只有按下回車之後才有可能檢測在此之前是否有Ctrl+Z按下。還有一個特點,   Windows下是不用CTRL+D的,如果在你的程式中使用CTRL+D的話,如果你還有要輸入的資料的話,會直接掛掉的,不能再輸入了。Windows下是使用CTRL+Z的。 在你輸入CTRL+Z後,括號裡面的資料變為0000 0000了。來看一段程式:(vc6.0上執行)

#include <iostream>
using namespace std;
int main(void)
{
int  i;
cout<<(cin>>i)<<endl;
return 0;
}

當你按下CTRL+Z後,按下兩次回車,就可以得到結果0000 0000.所以上面的while會退出迴圈。但是當你在你的程式中輸入資料的時候,你要結束輸入,你輸完資料直接回車,再按下CTRL+Z,再按下回車就可以結束了。因為前面說過如果輸入緩衝區中有可讀的資料則不會檢測 Ctrl+Z(因為有要讀的資料,還不能認為到了流的末尾)。還有一點需要知道,Ctrl+Z產生的不是一個普通的ASCII碼值,也就是說它產生的不是一個字元,所以不會跟其它從鍵盤上輸入的字元一樣能夠存放在輸入緩衝區。差不多就這麼多了,個人看法,有不當之處還請大家指點!謝謝!

對於while(cin>>word)cout<<word<<endl;這樣的程式碼,其實是一個死迴圈,可以加入讀取結束條件(預設條件是讀到eof),來跳出迴圈。

#include <iostream>
//#include <vector>
//#include <algorithm>
#include <string>
//include <list>

using namespace std;

int main()
{
	string word;
	while(cin>>word)
	{
		if(word=="o")
			break;
		cout<<word<<" ";
	}
	
	return 0;
}


當輸入hello i love you o時,便會跳出迴圈。

有技術才有魅力,在飄雪的季節守候花開!

相關推薦

cin.getline返回問題

     經過測試,用cin.getline()讀入一行資料時,如果輸入的資料大於函式引數中的字元個數n,則getline返回值為0!但cin.get()遇到這種情況的返回值不為0!如圖 #include <iostream> #include <stri

cin cout 返回 部分摘自網上

今天在看c++primer的時候,讀到其中這樣一段話:When we use an istream as a condition, the effect is to test the state of the stream. If the stream is validtha

標準輸入cin返回以及while(cin>>x)的問題

      最近在看C++,學到了標準庫這一章,看到cin的時候,我們經常看到很多的程式碼中會有這麼一段while(cin>>x){ ......}。這裡我們最關注的問題是whil

cin>>i返回的問題

  最近在看C++,學到了標準庫這一章,看到cin的時候,我們經常看到很多的程式碼中會有這麼一段while(cin>>x){ ......}。這裡我們最關注的問題是while括號裡面cin>>x他每次輸入的時候返回的是什麼值呢。所以我們也就會問cin

關於cincin.get()、cin.get(ch)返回的問題

1、cin、帶引數與不帶引數cin.get()的返回值問題    cin>>ch、和帶引數的cin,get()返回的是cin物件,只在需要bool型別資料的地方返回bool型別的資料;而不帶引數的cin.get()返回值是整型的字元編碼,也就是說可以用ch=cin

scanf,cin以及其返回

本人認為資料處理是非常重要的,如果能在輸入時候進行處理會省下很多事情。 關於scanf這裡整理了一下: 1:從scanf()角度看輸入 如果使用%d說明符,scanf()函式開始每次讀取一個輸入字元,它跳過空白字元(空格,製表符和換行符)直到遇到一個非空白字元,並持續讀

C++中cin,cout,以及返回

今天在看c++primer的時候,讀到其中這樣一段話: When we use an istream as a condition, the effect is to test the state of the stream. If the stream is val

cin和cout返回問題

cin和cout返回值問題  ---雨竹清風 今天看了段程式碼感覺怪怪的。 string value; while(cin>>value) {    cout<<value<<endl; } 哪不對吶?while迴圈條件,while迴圈判斷條件還能是非boo

c#獲取url請求的返回

web c# new mar string htm http class dto /// <summary> /// 獲取url的返回值 /// </summary> /// <param name="url">eg:htt

通過python socket遠程執行命令,並返回

python socket #!/usr/bin/env python# TCP-Serverimport socketimport subprocesssk_obj = socket.socket(socket.AF_INET,socket.SOCK_STREAM)sk_obj.bind((‘12

springmvc 註解式開發 處理器方法的返回

pri ajax mvc img 返回值 -1 分享 alt spring 1.返回void -Ajax請求 後臺: 前臺: springmvc 註解式開發 處理器方法的返回值

關於函數返回為指針類型的分析

三種 類型 常用 指針 動態內存 () 全局變量 動態 int 註意(原則):永遠不要返回一個局部變量的指針或引用(其實是隱式的指針),可以返回局部變量本身,因為函數執行完之後,將釋放分配給局部變量的存儲空間,局部變量只是臨時的存儲空間,此時,對局部變量的引用和地址就會返回

字節碼分析finally塊對return返回的影響

存儲 row 經驗 臨時 his 也不會 路徑 操作數 方法的參數 直接進入主題。看如下代碼: public int test(){ int i=0; try { i=1; return i; } catch (Exc

STL算法設計理念 - 函數對象和函數對象當參數和返回

實現 dsm last 返回值 class 算法 stream data 結果 函數對象: 重載函數調用操作符的類。其對象常稱為函數對象(function object),即它們是行為類似函數的對象。一個類對象,表現出一個函數的特征,就是通過“對象名+(參數列表)”的

返回為DataTable的數據,在MVC視圖裏的用法

ice tle per ble mode ldb pri shtml index 控制器裏的代碼如下: private MySqlDbHelper msh = new MySqlDbHelper(); public ActionResult

android-getTextSize返回是以像素(px)為單位的,setTextSize()以sp為單位

www normal title .get ext.get ref net tails rgb 使用如下代碼時,發現字號不會變大,反而會變小:size = (int) mText.getTextSize() + 1;mText.setTextSize(size);後來發現g

轉 linux shell自定義函數(定義、返回、變量作用域)介紹

shel 自己 lai cell define ber article clas ner linux shell 可以用戶定義函數,然後在shell腳本中可以隨便調用。下面說說它的定義方法,以及調用需要註意那些事項。 一、定義shell函數(define function)

springmvc Controller方法返回

response ping resp log mod for iter 頁面 轉發 1.1返回ModelAndView 不建議使用 1.2返回String 建議使用 @RequestMapping("updateItem") public String updat

expect實現自動scp和ssh登錄後執行命令,並向bash提供返回

ip地址 用戶名 expect 密碼 #!/bin/bash # 全局變量:用戶名,普通用戶密碼,root密碼 loginname="xxxx" userpwd="xxxx" rootpwd="xxxx" # 讀取iplist(逐行存儲IP地址) cat /root/iplist | whi

Java 中帶參帶返回方法的使用

public java public class mains { public static void main(String[] args) { mains hello = new mains(); int[] scores={79,52,98,81}; hello.sort(sc