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

2021-09-11 19:02:47 字數 1611 閱讀 1983

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語言中char a中的2是什麼意思是指能輸入的最大字元數還是什麼?最多能輸幾個字元和字元組

就是陣列能輸入2個字元。char a 2 這是宣告。宣告變數 a 是 char 型陣列,有2個元素。語句裡 寫 a 0 表示它是 char 型陣列a 裡的 第乙個 元素 a 1 是 char 型陣列a 裡的 第二個 元素。語句例子 a 0 a a 1 x printf c c n a 0 a 1 c...

如圖,在Rt ABC中,C 90,AC 10cm,BC 5cm,一條線段PQ AB,P,Q分別在AC和過A點且

結論應為 幾秒後 abc和 apq全等 已知條件缺乏,或錯誤,問題如下 1,缺乏 沒有p或q點的起始位置,無法計算多長時間後,三角形全等!2,錯誤 線段pq ab不變時,p,q兩點在規定軌跡上移動的瞬時速度不能相等,不可能同時以每秒2cm速度移動!關於2,證明如下 按圖,設p點的起始位置為ac中點。...