在C語言二級考試中,給出C語言小程序,讓考生分析運行結果的題目比較多,相對來說這方面的題目比較簡單,只要細心推導,得出結果不難。下面就由電仔談談這方面的解題經驗,主要是把我解題的過程寫出來,而不是講解理論。
工具/原料
歷年C語言二級考試真題
方法/步驟
程序:
#include
int main(int argc,char **argv)
{
int x=10,y=20,t=0;
if(x==y)t=x;x=y;y=t;
printf(“%d %d\n”,x,y);
return 0;
}
分析程序運行結果為?
電仔的解題步驟:
把 if(x==y)t=x;x=y;y=t; 語句這樣書寫
if(x==y)
t=x;
x=y;
y=t;
或者乾脆這樣書寫
if(x==y)
{
t=x;
}
x=y;
y=t;
可以看出 x==y 為假, t=x; 語句不執行
x=y,也就是x=20,t不變,也就是t=0
那麼 printf(“%d %d\n”,x,y ); 語句打印輸出
20 0
圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
程序:
#include
main()
{
int i,n[5]={0};
for(i=1;i<=4;i++);
{
n[i]=n[i-1]*2+1; printf("%d",n[i])
}
printf("\n");
}
則程序輸出結果是?
電仔的解題步驟:
for(;1<4;i++);
{
n[1]=n[1-1]*2+1; printf("%d",n[1]);
}
上面是第一次循環,n[1]=0*2+1=1,則 printf("%d",n[i]); 輸出1
for(;2<4;i++);
{
n[2]=n[2-1]*2+1; printf("%d",n[2]);
}
上面是第二次循環,n[2]=n[1]*2+1=3,則 printf("%d",n[i]); 輸出3
for(;3<4;i++);
{
n[3]=n[3-1]*2+1; printf("%d",n[3]);
}
上面是第三次循環,n[3]=n[2]*2+1=3,則 printf("%d",n[i]); 輸出7
for(;4==4;i++);
{
n[4]==n[4-1]*2+1; printf("%d",n[4]);
}
上面是第四次循環,n[4]=n[3]*2+1=3,則 printf("%d",n[i]); 輸出15
結束循環後執行 printf("\n"); 輸出換行
最後我們可以看到的輸出為
13715
圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
程序:
#include
main()
{
char c1,c2;
scanf(“%d”,(int *)&c1);
c2=c1+9;
printf(“%c%c\n”,c1,c2);
}
字符0的ASCII碼值為48,若程序運行時從鍵盤輸入48後回車,則輸出結果為?
電仔的解題步驟:
執行完 scanf(“%d”,(int *)&c1); 後,c1的值為48,對應的ASCII碼為字符0
執行完 c2=c1+9; 後,c2的值為57,對應的ASCII碼為字符9(0+9)
那麼執行 printf(“%c%c\n”,c1,c2); 輸出
09
圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
程序:
#include
main( )
{
int a=1, b=0;
if( !a ) b++;
else if( 0==a) if(a) b+=2;
else b+=3;
printf( "%d\n",b );
}
程序運行的輸出結果是?
電仔的解題步驟:
為了方便理解,我把主函數整理為等效的佈局和表達形式
main( )
{
int a=1, b=0;
if( !a )
{
b++;
}
else if( a==0)
{
if(a)
{
b=b+2;
}
else
{
b=b+3;
}
}
printf( "%d\n",b );
}
這樣就容易看出, !a 為假, a==0 也為假,所有條件語句括號內的語句都得不到執行,變量b的值不變所有 printf( "%d\n",b ); 輸出
0
對這題還不能理解的讀者歡迎在評論中提出,圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
程序:
#include
main( )
{
int a=1, b=2;
while( a<6 ) { b+=a; a+=2; b%=10; }
printf( "%d, %d\n",a, b );
}
則程序的運行結果是?
電仔的解題步驟:
同理,我也把main函數整理一下
main( )
{
int a=1, b=2;
while( a<6 ) { b=b+a; a=a+2; b=b%10; }
printf( "%d, %d\n",a, b );
}
接著推導while循環何時結束
while( 1<6 ) { b=2+1; a=1+2; b=3%10; }
上面是第一循環,最後 b=3 ,a=3
while( 3<6 ) { b=3+3; a=3+2; b=6%10; }
上面是第一循環,最後 b=6 ,a=5
while( 5<6 ) { b=6+5; a=5+2; b=11%10; }
上面是第一循環,最後 b=1,a=7
while( 1<6 )
條件不成立,循環結束執行 printf( "%d, %d\n",a, b ); 輸出
7, 1
圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
程序:
#include
main( )
{
char s[ ]="rstuv";
printf( "%c\n",*s+2 );
}
電仔的解題步驟:
這題牽涉到指針數組,有時間我再寫個指針數組的專題
*s+2 等效為 (*s)+2
也就是 'r'+2 ,換句話說取出字符ASCII的碼值加2,剛好是 t 的碼值
輸出和"rstuv"的‘t’沒有一點關係, *s+2 要是理解為 *(s+2) 輸出也是 t
但是這樣理解是錯的,比如把對應該語句改為 char s[ ]="rsuuv";
那麼輸出結果是 t 而不是u
圖為在Linux系統下編程驗證,圖中黑色部分為程序輸出結果
注意事項
這是個人的解題思路,讀者如果有更好更快的步驟歡迎反饋
文中可能存在的錯誤,讀者如果發現請務必指出