在c 中,Char a 10abcd”Cout《a《endl為何輸出的是abcd

時間 2021-09-11 22:33:35

1樓:滄海雄風

本來這個問題並不複雜,但是由於題主個別概念有些問題,所以還是深入回答一下。

a本身的值確實只是一個const char*型別的地址。但c++中cout是被定義好的一個類的物件,

它和運算子“<<”連用時《發生過載,語義被解釋為輸出《右端指示的字串。具體是通過運算子過載實現,類似於呼叫函式,只是右運算元作為地址被傳入這個函式,然後函式內解析地址進行輸出。注意過載是區分型別的,

所以如果a不是字元陣列名而是int變數或者其它型別的話,

(只要有定義過——對於基本型別在stl中已有定義)呼叫的是不同的輸出函式,

仍能得到正確結果。至於這裡的具體行為,是由過載的運算子(函式)

對傳入的引數指向的地址開始依次(從低地址到高地址,逐個地)

掃描並輸出該地址的char字元(準確來說是寫入標準輸出流stdout,

至於stdout裡的字元怎麼跑到螢幕上的實現過程是作業系統的事),直至遇到'\0'停止執行。

它和c標準i/o方式的printf("%s",a)類似(而不是puts(a),puts會把末尾的'\0'轉化為換行)。

a是char型別,這是不確切的。

a在編譯期由右端的字串字面量(引號為邊界的部分)初始化,確定為常量,型別為const char而不是char。

無論如何,這確實是一個地址常量而非指標(以整數形式儲存地址值的變數),這點是正確的。但lz並沒提到指標- -...

經過引數傳遞後,地址常量退化為對應型別的指標。也就是說在“<<”過載函式對應實現的內部而言,通過值參傳遞(a的值被複制在函式內產生一個副本),可以成為一個const char*型別的變數。注意這裡const指指標指向的內容不可改變,而不是指標本身的值不可改變。

----

robinren240 提到的大體正確,細節錯誤上面已經說了。

----

qds316 說:“當使用cout()或者printf()輸出該型別變數,就是字串陣列的時候,就會輸出資料直至遇到\0為止”。

這裡有問題。首先,cout()寫法錯誤;其次,a是常量,不是變數。當然,對於cout來說,常量作為“<<”的運算元也能和變數以一樣的形式輸出(參見以上討論),因為本身是隻讀操作,而a又是可以合法訪問的,自然沒有影響。

----

以上討論的問題引發的關於陣列名稱的問題:

陣列名本身是個地址常量,但是某些特殊情況下它的語義可以發生改變。例如sizeof(a),這時a表示整個陣列物件(這裡指語法物件,不是指類的例項)而不是這個常量本身。基於這個語義,對陣列名取地址也是合法的,對於陣列a來說&a的結果等於a這個地址常量本身的值。

這是c/c++標準委員會為了維護語法物件a作為一個左值(l-value)總可以取地址這條原則的妥協。

----

c/c++是傳統的強型別語言。儘可能清楚掌握“型別”對於理解程式和寫出更高質量c/c++的**都有幫助。

2樓:扈懷煒

在 c、c++中,字元陣列的陣列名指向字元陣列的首地址,在輸出時,會吧整個陣列看成一個字串輸出,也就是說這裡認為a是一個字串。

3樓:匿名使用者

因為c++知道 a是一個字元指標,知道要輸出字串

cout從首地址開始輸出,直到遇到字串結束字元'\0'結束輸出

char a在c 中應該怎麼表示

因為像 等等字元在程式中有特別的用途,所以為了正常使用它,就需要複雜一點的表示了,此時c中用 來引起一個表示式就是了。後邊的表示式有幾種,一種就是引起 等然後就是引起一個8進位制表示式如 054,其中0必須有,表示8進位制或者一個十六進位制的表示式 x9f,其中x表示十六進位制,同樣不可省略這種情況...

在c中a4b10c2計算abcac3a的最

如果a,b,c,是int型的話 1 4 10 2 4 2 3 4 2 4 10 2 6 3 4 3 4 20 6 3 4 4 4 3 3 4 5 4 0 4 6 4 c 的優先順序 優先順序 操作符 結合性 1 左 2 左 3 sizeof new delete castname cast單目操作符...

在C中private static public他們宣告的方法 變數有什麼區別

首先是private和public,private出了這個類就無法訪問了,只有在類裡面才可以修改值,一般只有欄位才會用private。public是公開的,裡面外面都可以訪問,裡面外面都可以修改值,屬性 方法基本都是public的。而static是靜態的,呼叫方式不同,比如person類假如有個函式...