c語言問題

2021-12-25 08:13:44 字數 5059 閱讀 4726

1樓:匿名使用者

#include

template

void insert(std::list& l, const t& where, const t& value)

template

void push_back(std::list& l, const t& value)

template

void del(std::list& l, const t& value)

int _tmain(int argc, _tchar* ar**)

c語言問題

2樓:風林火陰山雷

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

void get_put()

以此類推。

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

如有問題歡迎追問~

c語言問題

3樓:匿名使用者

首先我們計算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)

4樓:

|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允許訪問的情況下的結果。一般情況下這個地址是系統保護的,不允許訪問,所以你試不出來。這種寫法也是不提倡的,因為很危險。

5樓:

先看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語言問題

struct student拼寫成struct studnt了。拼寫錯誤 struct studnt沒有定義,所以無法執行sizeof。include typedef struct student int main c語言問題?嗯你的理解是對的,break就是用來跳出的switch,如果沒有brea...

c語言問題,c語言問題

首先你這個程式輸入個數是不可控的,n沒起到作用,因為你控制輸入的迴圈已經規定了i是從0到99,必須要輸入100個。而你這個 自認為統計總人數 的n n i,相當於n 1 2 3 那是不可能的。while xh i scanf d d xh i sg i n i sum sum sg i 用美元符號做...

c語言問題,C語言問題

if判斷句中,x 1 是真命題,所以x被賦值為1,y x,所以y被賦值為1。下一條語句,y y 1,所以y 2。所以x 1,y 2 c語言問題?這句迴圈的bai意義是從索引9開始du 向左遍歷元素,直到i j結束。zhi 整段代dao碼是接收鍵盤輸版入一個值,按大小順序插權入到陣列。第一個迴圈是從陣...