C/C++練習問題解析(一)

1703 ワード

[Question]
次のセグメントがあります.
char ch=-1;
printf(“%02x,%02x”,ch,(unsigned char)ch);

出力:
[A] -1,-1
[B] ff,ff
[C]ffffffff,ff
[D]ff,ffffffff 
[Answer]
出力に関する知識点:
%c 1文字を読み込む
%d 10進数を読み込む
%o 8進整数を読み込む
%x 16進数を読み込む
%sは、スペース、タブ、または改行で終了する文字列を読み込みます.  
%pポインタを読み込む
%u符号なし10進数整数を読み込む
本題の%02 x,%xは16進整数を出力することを指し,2は少なくとも2ビットを出力することを指し,0は不足ビットを0で満たすことを指す.
シンボル拡張について:
短いデータ型は長いデータ型に拡張されます.
①ch:拡張するデータ型は符号型があり、長いデータが多く出てくる高バイトを短いデータの符号ビットで埋め、-1(11111111)intに拡張し、符号ビットを1とすることにより、11111111111111 11111111 11111111(ffffff)を得る
②( unsigned char)ch:まずchを符号なし整数に変換し、-1(11111111)->255、このとき符号ビットは0であるため、00000000 00000000 00000000 11111(ff)を得る
[Question]
一般表L=(a,(b,c)),Tail(L)操作後の結果は()である.
[A] c[B] ((b,c))[C] b,c[D] (b,c)
[Answer]一般表、すなわち鎖表であり、L長は2であり、原子aとサブ表(b,c)であり、1つの一般表の末尾表は常に一般表であり、Bはサブ表(b,c)のみを含む一般表であり、要求に合致する.
[Question]
次のセグメントの出力結果は
char *p1 = ”123”, *p2 = ”ABC”, str[50] = “xyz”;
strcpy(str + 2, strcat(p1, p2));
printr(“s
”, str);

[A] xyz123ABC
[B] z123ABC
[C] xy123ABC
[D]エラー
[Answer]
char*p 1="123"は文字列ポインタp 1を宣言し、文字列"123"を指す.このときの"123"は定数領域に格納され、スタックにコピーされていないため、p 1[0]='2'を修正することは誤りである.char p 1[10]=「123」に変更すれば、p 1の値を変更できます.
 
[Question]
次のコードは何を出力しますか?
int a =1,b =32 ;
printf("%d,%d",a<

[A] 1,1
[B] 1,0
[C] 0,0
[D] 0,1
[Answer]
a<を実行すると、コンパイラはまずbと31をand操作して、左シフトの回数が31以下であることを制限します.b&31=0の場合、a<が1<<32を実行すると、コンパイラは直接算術左シフトの操作を実行し、このときオーバーフローが発生し、トップの1が除去され、残りは0であり、最後の答えは0である.