C輸出char問題,C 中定義char name 20 後,為什麼用printf s ,name 就能輸出一連串字串

時間 2021-09-03 07:07:18

1樓:

如果你寫的是

cout<('a'+'c')/2<輸出-62我並不覺得奇怪。

因為'a'的ascii碼是65,'c'是67。相加是132。

'a'+'c'的「結果型別」是int,因此它的十六進位制是0x00000084,最高位是0表示正數!(你可以求sizeof('a'+'c')驗證一下,是4,int的大小)

3. static_case('a'+'c')相當於static_case(132)。

4. (char)132的十六進位制是0x84,二進位制是1000 0100,最高位符號位是1表示這是個負數!

5. 用8位補碼解析0x84,得到的結果是-62!

用下面的告訴你結果:

#include

using namespace std;

int main()

/*輸出:

('a'+'c') = 132 = 0x00000084

(int)(char)('a'+'c') = -124 = 0xffffff84

*/最後再補充一句,為了不讓'a'+'c'的結果「溢位」,導致char('a'+'c')/2得到負數,更好的辦法是char('a') + char('c'-'a')/2。

這兩種做法雖然數學上是等價的,但是第一種方法的「中間計算過程」存在「溢位」,導致結果不是想要的。

ps:第二種做法在做二分查詢和快速排序的時候也都會用到!

2樓:

cout<<(char)(('a'+'c')/2)<

3樓:匿名使用者

我這輸出b,也許就是你編譯器有bug

c++中定義char name[20]後,為什麼用printf("%s",name)就能輸出一連串字串?

4樓:匿名使用者

%s代表bai字串,name是字元陣列

的首地址du,也就是字串zhi的首地址。dao所以直接專輸出字串。

c++中定義屬char型陣列即是定義c風格字串。

格式化輸出函式printf第一個引數中%s代表可變引數部分中對應位置變數為指向字串地址的指標。

在c/c++中陣列的名是儲存該陣列首地址的常量。

需要注意:

(1)c++中定義內建型別區域性陣列變數,不提供預設初始化。這裡char是內建型別,如果不初始化其中儲存的是記憶體中的隨機數。

(2)c++不會對陣列進行越界檢查,而是將越界交給os,如果os檢測記憶體不可讀或寫,對齊進行讀寫os核心會丟擲中斷異常。

(3)c++中c-style字串讓然是以'\0'空字元為結束標誌。printf中的%s仍然會在輸出的時候從name指定的記憶體位置開始讀取資料再交給現存快取以在顯示器上顯示。不初始化或不以'\0'結尾的字串將輸出亂碼,這是如果越界讀取到了不可讀的記憶體,將會報段錯誤(unix核心)或記憶體不可讀(windows)異常以終端程式。

5樓:

%s的概念 就是輸出字串

字串必須要以'\0'結尾

也就是如果你

的name[20]中有一個位置是'\0'的話專printf("%s",name)就能正確輸出如果你是這樣屬char name[20]=;由於name陣列中沒有'\0'你對name指標用printf函式就會出錯

6樓:匿名使用者

%s是從起始位置輸出字元直到遇到\0為止,合法,

陣列在函式中做實參時會轉成指標。

7樓:匿名使用者

1,%s 是輸出字串;%c,只輸出單個字元。

2, 定義name是陣列,name表示陣列的第一個字元的地址

8樓:匿名使用者

陣列傳遞給printf函式當引數時,自動退化成指標,printf函式輸出指標指向空間,預設到'\0',結束,所以合法

9樓:wang非在心上

這個復就不需問為什麼啦!!因製為這是它的功能bai啦!!就像1+1為什麼等於du2了。你只需要zhi記住它的作用就是dao 用來輸出資料的!!

那個%s是格式識別符號啦!!就是規定後面的引數是以怎樣的格式輸出的!!另外還有其他幾種常用格式識別符號,%c、%d、%o

10樓:匿名使用者

printf函式本來就是c中的函式 。。

c,c++中關於char* 以及 char陣列的問題

11樓:veket的小號

1.因為 iostream內部 cin cout 對char* 做了特殊處理.......因為c/c++ 輸入輸出字串通常要用到char*

如果直接輸出地址,就要用別的方法來輸出字串了 就不方便了.....所以直接輸出地址 那裡放著的字串......

3、sizeof("hello");得到 字串實際長度 + \0 佔的一個位元組

一般用strlen函式.......

同 1、2,str陣列名 是 char* 地址

12樓:愛問西瓜愛答樹

pstr是指標,*pstr,取地址的內容。顯示什麼,這個取決於cout用哪個函式,由引數型別決定。想輸出字串的地址用char str2="123abc";

2.arr是陣列,是首地址。int * ,表示指向的地址空間是int 4位元組的,char *當然是char 1位元組的。

3.sizeof("hello");

4.cout有個對字串輸出的過載,全部輸出,遇到'\0'結束。

13樓:匿名使用者

運算子過載可以做任何事情,沒有任何規則所只要是地址列印出就是地址。而且char*是特殊的,從來沒有在哪輸出過地址

運算子過載,不是int/char不同,而是過載後int*和char*不同

sizeof("hello"),這是唯一的辦法,賦值給指標後只能用strlen,不能用sizeof

同樣,不要總想著引數是地址,輸出也是地址,如果這樣,高階語言就太無用了

14樓:

1、這是cout(const char *)函式的定義。為方便處理字串。

2、字串是陣列,int只是一個數;

3、include

4、同1.

c語言的問題char型輸出的16進位制數值怎麼輸出十進

1 對計算機來說,某一個變數不管是char,int,它在儲存時都是二進位制的數字而已,輸出16進位制應該是在com putchar中控制的,對於一個數來說,輸出的格式是幾進位制是程式來控制的,比如printf d dl 那麼送到終端顯示的是十進位制的,如果是 x就是16進位制,o就是8進位制,但是在...

c語言char輸出字串是亂碼,C語言,字串輸出是亂碼

重點是creatlist這個函式,datac必須是malloc分配出來的記憶體,不然就會出問題.應該是這樣的 p pdata malloc 256 scanf s p pdata 傑大哥哈哈哈 asadrcvs5 2 f amng bkuqte lzlr kxojfrc eqsauzx 夫婿久離別,...

c語言定義整型資料輸出字元,C語言定義整型資料輸出字元

吉祥二進位制 本身字元型別即為整型的一種,當把大位元組的整型資料型別比如int型別以字元型別的形式輸出時,一般輸出函式會對大位元組整數型別進行截斷操作,它等同於將大位元組整型變數 常量轉換為小位元組的整型變數 常量。比如下面的 include int main void 把unsgined型別作為c...