C語言疑問

2021-04-20 04:58:00 字數 5398 閱讀 2349

1樓:

轉義字元一bai般格式為'\'加三位du八進位制數或者zhi'\'加兩位十六進位制數,也

dao就是'\ddd'和'\xhh'。'\101'和'\116'是轉回義字元,表示ascii碼分答別為八進位制101和八進位制116的字元,對應十進位制的65和78,也就是'a'和'n'。

特殊轉移字元有:

\b 退格

\f 走紙換頁

\n 換行

\r 回車

\t 橫向跳格 (ctrl-i)

\' 單引號

\" 雙引號

\\反斜槓

2樓:蓉雪球

\101是八進位制,轉換成十進位制就是65

65對應的ascii碼值就是a

\116是八進位制,轉換成十進位制就是78

78對應的ascii碼值就是n

3樓:幻琴公子

'\'為轉義字元,後邊加的數字是字元的ascii碼,列印出來的就是ascii碼對應的字元

101 就是 a;

116 就是 n;

4樓:鳴天飛鳥

c4=101,c5=116;

即可,不需要''和\

執行為:e t

c語言問題

5樓:風林火陰山雷

先回答你第一個問題,遞迴函式確實是讓ch變數不斷獲得新的值,從1到5。需要注意的是,之後每一次的賦值只在當前的大括號內有效:

void get_put()

以此類推。

第一個問題,你已經注意到這是遞迴了,那麼輸入12345並按回車後,自然出現了get_put函式五層巢狀,也就有5次putchar了。

如有問題歡迎追問~

c語言問題

6樓:匿名使用者

首先我們計算mpll_val的值。這裡涉及兩個操作符<<(左移)和|(異或),都是二進位制運算子。具體定義這裡就不說了,可以自己查下。

mpll_val = (92<<12)|(1<<4)|(1);

92轉換成二進位制為01011100,將此數左移12位,也就是後面加12個0,變成01011100000000000000,轉換成十進位制為2^14+2^15+2^16+2^18 = 376832,

同理,1<<4轉換成十進位制為16,上面mpll_val  = 376832|16|1,這個其實就相當於

376832+16+1(很簡單,知道了異或的規則用二進位制計算就知道了)。因此:

mpll_val  = 376849

下面的rmpllcon的值計算需要理解三個概念:函式,引數,異與操作符

函式指的的就是void changempllvalue(int mdiv,int pdiv,int sdiv);

引數指的是這個函式中定義的三個整型引數,在下面的具體宣告中,也是這三個引數:

void changempllvalue(int mdiv,int pdiv,int sdiv)

最後實現過程changempllvalue((mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3);這三個引數分別對應(mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3這三個值。

這裡我們只將第一個引數的值(mpll_val>>12)&0xff是多少:

mpll_val我們剛才已經計算為376849,現在mpll_val>>12就是右移,與左移相反,等於我們又將mpll_val打回原形變成了92,那麼下面我們計算92&0xff,這裡我們需要知道0xff是一個十六進位制數。

以0x開始的資料表示16進位制,0xff換成十進位制為255。

a,b,c,d,e,f這五個字母來分別表示10,11,12,13,14,15。

16進位制變十進位制:f表示15。第n位的權值為16的n次方,由右到左從0位起。

0xff = 15*16^1 + 15*16^0 = 255

16進位制變二進位制再變十進位制:

0xff = 1111 1111 = 2^8 - 1 = 255

也就是92&255,用二進位制表示就是

01011100

&11111111

=01011100

因此(mpll_val>>12)&0xff的值就是92,同理可以得出後面兩個引數的值。最後代入

rmpllcon = (mdiv<<12) | (pdiv<<4) | sdiv;(計算得知mdiv = 92,pdiv = 1, sdiv = 1)

最後計算rmpllcon,你一定以為是376849,但是不是的,結果應該是沒辦法寫入的,因為

#define rmpllcon    (*(volatile unsigned *)0x4c000004) //mpll control

簡單來說這句話就是定義rmpllcon為一個指向固定地址的常量,不是變數,具體參考http://blog.sina.

最後,提供一個驗證程式,自己除錯看看吧:

#include

#include

void changempllvalue(int mdiv,int pdiv,int sdiv);

#define rmpllcon (*(volatile unsigned *)0x4c000004) //mpll control

int main()

void changempllvalue(int mdiv,int pdiv,int sdiv)

7樓:

|mpll_val = 01011100<<12 | 00000001<<4 | 1 = 01011100000000000000 | 00010000 | 1 = 01011100000000010001 = 376849;

rmpllcon = ((01011100000000010001>>12)&0xff)<<12 | ((01011100000000010001>>4)&0x3f)<<4 | 01011100000000010001&3

= (01011100&11111111)<<<<

= 01011100<<12 | 00000001<<4 | 00000001

= 01011100000000000000 | 00010000 | 00000001

= 01011100000000010001

= 376849。

changempllvalue();沒有值,因為它的返回值是void型。

不過這是假設地址0x4c000004允許訪問的情況下的結果。一般情況下這個地址是系統保護的,不允許訪問,所以你試不出來。這種寫法也是不提倡的,因為很危險。

8樓:

先看mpll_val的值

unsigned int型別是4個位元組,92轉換成二進位制是

0000 0000 0000 0000 0000 0000 0101 1100

92<<12,這個意思是把92這個數按二進位制位操作,左移12位,於是得到

0000 0000 0000 0101 1100 0000 0000 0000

同理1<<4,四位元組二進位制表示就是

0000 0000 0000 0000 0000 0000 0001 0000

(92<<12)|(1<<4),「|」這個是按位或運算子,就是把以下兩個數按位或運算

0000 0000 0000 0101 1100 0000 0000 0000

0000 0000 0000 0000 0000 0000 0001 0000

結果是0000 0000 0000 0101 1100 0000 0001 0000

最後這個數字再和1按位或運算

0000 0000 0000 0101 1100 0000 0001 0000

0000 0000 0000 0000 0000 0000 0000 0001

結果是0000 0000 0000 0101 1100 0000 0001 0001

對應十進位制數是376849

看rmpllcon的值之前,先看函式changempllvalue的計算過程,三個引數如下:

(mpll_val>>12)&0xff, (mpll_val>>4)&0x3f, mpll_val&3

mpll_val的值是

0000 0000 0000 0101 1100 0000 0001 0001

mpll_val>>12是右移12位,得到結果是

0000 0000 0000 0000 0000 0000 0101 1100

(mpll_val>>12)&0xff,「&」是按位與運算子

0000 0000 0000 0000 0000 0000 0101 1100

0000 0000 0000 0000 0000 0000 1111 1111

以上兩個數按位與的結果是

0000 0000 0000 0000 0000 0000 0101 1100

(mpll_val>>4)&0x3f,mpll_val右移4位,與0x3f按位與,結果是

0000 0000 0000 0000 0000 0000 0000 0001

mpll_val&3的結果是

0000 0000 0000 0000 0000 0000 0000 0001

所以三個引數是

0000 0000 0000 0000 0000 0000 0101 1100

0000 0000 0000 0000 0000 0000 0000 0001

0000 0000 0000 0000 0000 0000 0000 0001

對應十進位制分別為:92,1,1

所以 (mdiv<<12) | (pdiv<<4) | sdiv帶入引數後,實際還是(92<<12)|(1<<4)|(1)

計算結果也是376849

#define rmpllcon (*(volatile unsigned *)0x4c000004)

根據這個定義rmpllcon是一個符號,代表 (*(volatile unsigned *)0x4c000004),編譯器會用 (*(volatile unsigned *)0x4c000004)代替rmpllcon,所以rmpllcon不是一個變數,也就沒有值。

rmpllcon = (mdiv<<12) | (pdiv<<4) | sdiv;這句的結果是會把等號右邊的計算結果賦值給(*(volatile unsigned *)0x4c000004),這裡定義的是一個常量指標,這個指標指向的地址做什麼的我不清楚,我這裡測試執行了一下,系統出錯,提示不允許對這個地址操作。

changempllvalue()這個函式定義沒有返回值,所以changempllvalue是空值。

C語言位運算對的疑問,C語言位運算裡這些怎麼用?

實際位操作時,都是按儲存型別的所有位進行的char 8位 short 16位 int 32位 前面的 實際操作時也是按上述的位數進行的 至少是8位 只是寫出來時全部是0,所以就省略了。因為取反後,0就變成了1,就不能省略了。所有位運算都是8個bit位來運算的,因為一個byte是最基本的單位 你說的 ...

一道初級c語言的疑問

暈死,居然說什麼的都有.很現眼的錯誤,就是單詞拼錯了啊 還有些小錯,改後的程式 include void main i,j printf array a n for i 0 i 2 i printf array b n for j 0 j 3 j 這裡原來是i 我不能確定 好像是你的printf n...

關於C或者 C語言中字串和指標問題的疑問求高手解答

s是指向字串的指標,s是printf格式化輸出字串,而 c是printf格式化輸出單個字元。s相當於s 0 所以輸出單個字元。輸出地址用 p。輸出格式定義,定義了輸出什麼型別的變數,輸出時做怎樣的轉換。printf s s 格式 s 定義了輸出 一個字串,輸出變數 提供 輸出的 char 型 陣列 ...