1樓:
while(*t)
t++;
t--;
也就是while(*t)
t--;
分析 t本來指向a[0]
*t == a[0 ]
如果a[0] 不是 '\0',那麼 t++ ,使t指向a[1]如果a[1] 不是 '\0',那麼 t++ ,使t指向a[2]...t一個個往後指當 t指向 '\0',即*t=='\0' 也就是 while(0)迴圈結束
此時 t指向 '\0'
然後 t-- ,那麼t就倒車, 指向 字串的最後一個字元了!
再看二個while:
while(*t=='*')
前面說道 t指向了 字串的最後一個字元,這裡 迴圈退出的條件是 *t 不等於 '*'
對於字串
"****a*bc*def*g*******"
t指向最後的那個 *
滿足進入迴圈的條件
執行k++,k從0變為1,執行t--,t指向最後第二個字元最後第二個字元也是 *
同樣滿足迴圈條件,k繼續加,t繼續 減
...當t指向 g時 迴圈條件不滿足了,
經過上面的迴圈 k 數出了 字串尾部 * 的個數 ,t從後向前移動 指向了不是 * 的g
再看 if
if(k>n)
2樓:幹睿識
呵呵,是這樣的!
如果一個字串是"abc"那存在計算機裡是字元:'a' 'b' 'c' 'd' \0'
那麼:剛開始 t 指向第一字元例如是字元 'a'
while(*t) 相當於while( *t !=0 ) 也就相當於 while( *t != '\0')
那麼也就變成了:
while( *t != '\0')
t++;
這個迴圈什麼時候跳出?當 t 指向 '\0'的時候,也就是說,迴圈結束時,,t 指向 '\0'
所以,要 t --,把 t 向後挪一位置~~
c語言問題
3樓:一個能通過的名
首先你的scanf語句不對,應該是:scanf("%lf %lf", &a, &b),正確格式是:scanf("《格式化字串》",《地址表》);
你的printf語句應該是:printf("得到一個和為%f + %f = %f\n" ,a,b,a+b);,正確格式是:printf("輸出格式型別",變數),前面的輸出格式型別的數量,要和變數的數量一樣
4樓:
printf("得到一個和為%f + %f = %f\n", a+b);
你寫了三個佔位符%f,為什麼後面只有一個值對應?
請把a、b、a+b這三個值都寫上去
另外,你的scanf為什麼要把&a和&b寫到引號裡面?請改
c語言程式設計問題
5樓:手機使用者
解題思bai路:完全跟百錢買百雞的問題是du一樣的!設大zhi馬,中馬,小馬dao的匹數分別為x,y,z;可以得到回兩個方程:
x+y+z=100; 3*x+2*y+z/2=100; 將第二個
答方程變形為:6*x+4*y+z=200; 從第二個方程變形的方程中,我們可以看到,x的最大值為200/6=33.3;即中馬,小馬都不用,只用大馬最多用34;1<=x<=34; 同樣中馬y的最大值為200/4=50;1<=y<=50;再將第三個方程減去第一方程變成5*x+3*y=100;這個方程就是我們簡化後的判斷條件用列舉法求可的如下的程式:
#include
int main()}
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語言程式設計問題?
小黑哎啊 include include 數學函式標頭檔案 include void fun1 函式宣告 void fun2 int main while 1 int x for int i 0 i 20 i printf printf n1,求整數n的立方 n printf 2,判斷是否能構成三角...
c語言程式設計問題,c語言程式設計問題?
聽不清啊 include int main int i,n double sum 0 scanf d n for i 1 i n i sum i i 1.0 i 1 printf f n sum return 0 威爾史密斯 include void main c語言程式設計問題 手機使用者 解題思...
c語言程式設計問題,C語言程式設計問題。
你的scanf中間錯了,應改為scanf d d m,n 另外d a c b 將d改為float型別比較好。c語言出現了一個問題,導致程式停止正常工作,請關閉程式 1 野指標,你使用的指標指向未知區域 2 scanf函式輸入整形 字元 的時候缺少了 3 緩衝區溢位,也就是說你使用陣列時不經意間越界了...