1. 程式人生 > >錯題集(三)

錯題集(三)

復習 [] 進行 編譯 div 目前 小端 輸出結果 雙精度

以下程序的輸出結果是( abc+abc=defdef)

 1 char
 2 cchar(char ch)
 3 {
 4 if(ch>=‘A’&&ch<=‘Z) ch=ch-‘A+‘a;return ch;
 5 }
 6 main()
 7 { char
 8 s[]="ABC+abc=defDEF",*p=s;
 9 while(*p)
10 {
11 *p=cchar(*p);
12 p++;
13 }
14 printf("%s\n",s);
15 }

這道題很簡單,遇到大寫字母就轉換成小寫字母。我想重新復習以下ASC碼表:

技術分享圖片

可以看到,A~Z十進制表示為65~90 a~z十進制表示為97~122。

2.以下能正確定義二維數組的是( int a[][3]={}; )

int a[][3];   //可以省略一維,但必須初始化  
int a[][3]=2{2*3};
int a[][3]={};
int a[2][3]={{1},{2},{3,4}};
第一個如果是定義就必須知道維度,如果不寫維度,可以不寫第一個維度,但是不能省略第二個維度,但必須初始化。 第二個2*,瞎寫沒見過。 第三個正確可以省略第一個維度,但是不能省略第二個維度,且進行初始化。 第四個超過指定行數了。 3.
1
int main(){ 2 int a;float b,c; 3 scanf("%2d%3f%4f",&a,&b,&c); 4 printf("\na=%d,b=%d,c=%f\n",a,b,c); 5 }

若運行時從鍵盤上輸入9876543210l,則上面程序在gcc編譯器下的輸出結果是 鏈接:https://www.nowcoder.com/questionTerminal/316082aaacfe4c3f8faf004e3e0fcf6d
來源:牛客網

printf函數執行的時候,會先把這三個數字壓入棧裏,然後再執行打印。壓入棧的時候按照數據本身的長度來,首先把c和b壓入,並且每一個都是8個字節(printf自動轉化為double)。然後再壓入a是4個字節。然後再執行打印。打印的時候按照用戶指定的格式來出棧。首先打印a,a打印正常。然後又打印4個字節長度的b,在棧裏面由於b長度是八個字節,並且b目前是64位的表示方式,數據的後面全是0.(float 變double),電腦是小端存儲方式,0存儲在距離a近的地方。打印b的時候,打印的4個字節都是0.然後再打印c,c用正常的方式打印,會一下子讀取8個字節,正好,讀出來的八個字節前面四個字節全是0,自己可以算一下,實在太小了,因此為0. 棧底 棧頂 高字節。。。。。。。。。。。低字節 4321 0000 765 0000 98 4字節 4字節 4字節 4字節 4字節 打印c 打印b 打印a 附:浮點數(單精度的float和雙精度的double)在內存中以二進制的科學計數法表示,表達式為N = 2^E * F;其中E為階碼(采用移位存儲),F為尾數。

float和double都由符號位、階碼、尾數三部分組成,float存儲時使用4個字節,double存儲時使用8個字節。各部分占用位寬如下所示:

符號位 階碼 尾數 長度

float 1 8 23 32

double 1 11 52 64

錯題集(三)