今天上Liunx實(shí)驗(yàn)課肪笋,查資料時(shí)突然看到了西郵Liunx面試題友绝,比較好奇铐刘,就打算看看佛嬉。
<h1>一</h1>
分析下面程序的輸出:
int main(int argc, char *argv[])
{
int t = 4;
printf("%lu\n", sizeof(t--));
printf("%lu\n", sizeof("ab c\nt\012\xa1*2"));
return 0;
}
分析:
轉(zhuǎn)義字符“%lu”,對(duì)整型指定長(zhǎng)整型long;"\n"只是換行,sizeof()是數(shù)據(jù)類型長(zhǎng)度垒在,t是用int定義蒜魄,那長(zhǎng)度就應(yīng)該是4扔亥,所以它應(yīng)該首先輸出4;
根據(jù)上面分析可以知道第二行輸出只需要計(jì)算“ab c\nt\012\xa12”的字節(jié)數(shù):“ab c\nt\012\xal2" 存貯空間字節(jié)數(shù):a谈为、b旅挤、'0'、c伞鲫、\n粘茄、t、\012秕脓、\xa1柒瓣、*、2吠架、\0; 共11字節(jié)數(shù)芙贫,所以應(yīng)該輸出11.
敲代碼運(yùn)行:
<h1>二</h1>
分析下面程序的輸出:
#include<stdio.h>
int main(int argc,char *argv[]){
int a=10,b=20,c=30;
printf("%d %d\n",b=b*c,c=c*2);
printf("%d\n",printf("%d",a+b+c));
return 0;
}
分析:
第一次輸出時(shí),它會(huì)先進(jìn)行運(yùn)算傍药,c=60,所以b=1200磺平;
第二次輸出,輸出兩次1270拐辽。
敲代碼運(yùn)行:
額....為什么和想的不一樣呢拣挪?這個(gè)4是哪里輸出的呢?為了測(cè)試我在第二次的兩次輸出前加了注釋:
printf("test1:%d\n",printf("test2:%d",a+b+c));
運(yùn)行程序:
可以看到第二次的輸出在前面輸出的是a+b+c的值俱诸,那第一次的輸出怎么變成10了呢菠劝?我們是在加了“test2:”然后它就變大,加的正好是6個(gè)字符睁搭,然后它就增大6闸英,由此可以推出它的輸出是和“test2:%d”有關(guān),那和后面的有關(guān)嗎介袜?
printf("test1:%d\n",printf("test2:%d\n",a+b+c));
輸出(添加換行符讓代碼看起來更清楚):
1200 60
test2:1270
test1:11
然后修改后面代碼:
printf("test1:%d\n",printf("test2:%d\n",b+c));
輸出:
1200 60
test2:1260
test1:11
由此可見,第一次的printf是和后面printf的字符長(zhǎng)度有關(guān)出吹,具體是為什么我搜了一下谷歌遇伞,都比較模糊,沒有明白捶牢。
(下課了鸠珠,剩下的題下次有機(jī)會(huì)再嘗試)