C言語について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Jasa rock

C言語について

#1

投稿記事 by Jasa rock » 13年前

各問題にはstdio.hがファイル先頭でインクルードされているとします。


1  char a[] = "CHR";
int i = 0;
do{
printf("%c",*a + 1);
}
while(*(a + i++));
return 0;

2 typedef struct {
char a[3];
} DAT;
typedef struct {
double x;
DAT dat;
} D;
D d = {1.2,"BY"};
printf("%c", *(d.dat.a+1) - 1);
return 0;

3 int i =31;
int j = 253;
while (i){
j &= i
i >>= 1 ;
printf ("%d",j);
}
return 0;


上の3つで
1 DDDD
2 X
3 2913511
という結果が出ると思うのですが、どうしてこの結果になるかわかりません。だれか詳しく教えていただけないでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C言語について

#2

投稿記事 by softya(ソフト屋) » 13年前

自分で組んだプログラムでは無いんですよね?
課題であるかどうか教えてください。
フォーラムルールにあるテンプレートを使って今の理解レベルなどを教えてください。その場合詳しく理解レベルを知りたいので、文字、文字列、配列、構造体、ポインタ、&演算などの論理演算に付いて分かっている事を書いてみてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Jasa rock

Re: C言語について

#3

投稿記事 by Jasa rock » 13年前

今、先週のテストの復習をしています。
1if文、for文はわかるんですが、do while文はいまいちわかりません。
2構造体は全く分りませんので、今復習しながらしていますが・・・
3ビット演算の話だとは、理解できていますが、&=がよくわかりません。ビット演算は2進法以外でも使えるのですか?

maru
記事: 150
登録日時: 13年前

Re: C言語について

#4

投稿記事 by maru » 13年前

Jasa rock さんが書きました:今、先週のテストの復習をしています。
1if文、for文はわかるんですが、do while文はいまいちわかりません。
2構造体は全く分りませんので、今復習しながらしていますが・・・
3ビット演算の話だとは、理解できていますが、&=がよくわかりません。ビット演算は2進法以外でも使えるのですか?
do while文の構造は

コード:

do
      statement
      while (expression);
まず、statement を実行し、その後 expression を評価し、その評価結果が真である場合、 do に戻る(つまり statemet を実行して、expressionを評価して、,,,の繰り返し)。
評価結果が偽である場合、 次の文の処理に移る。
もちろん、statement は {} で括られた複文であっても良い。
というものです。
つまり終了判定を実行後にした繰り返し処理です。これに対して while文は事前判定型の繰り返し文になります。
さて、1が分かるようになるまでは、do while文だけでなく、文字、文字列、ポインタの知識が必要ですが、どこまで分かりますか?(って softyaさんも聞いてるし。)

次に2ですが、構造体はいくつかの変数を纏めて一つの型として扱えるようにしたものです。
ただ構造体が分かっても typedef という型宣言を知らないと2の文は読み解けません。

&= はビット論理積代入で、ビット論理積と代入を合わせたものです。左辺に右辺をANDし、その結果を左辺に代入します。
一般に+-*/などの演算子の右に=をつけたものは、左辺に右辺で所定の演算を実行し、左辺に代入を行います。
int型は2進法で処理されるのでビット演算可能です。31とか253は10進表記ですが、計算機内部では2進法で処理されています。
Jasa rock さんが書きました:どうしてこの結果になるかわかりません。だれか詳しく教えていただけないでしょうか?
解説するのは簡単ですが、もう少し考えてからにしませんか?
テストに出たということは、上記の理解に必要な知識は授業で習ったはずですよね。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: C言語について

#5

投稿記事 by softya(ソフト屋) » 13年前

必要な知識を整理してみましょう。
テストの復習と言うことなら教科書などに書かれていると思いますので見なおしてみてください。
問題を見る限りC言語の大抵の知識が身についている前提の問題ばかりだと思います。

1.の問題は文字コード、文字の配列=文字列、do~whileの動作に関しての知識、ポインタ演算の理解が必要です。
あと前置インクリメントと後置インクリメントの動作の違いも把握している必要があります。

2.の問題は、typedef、構造体、構造体を含む構造体、構造体の初期化、文字コードの知識が必要です。

3.の問題は、intの整数は2進数で演算され格納されているという知識が前提です。
10進数は人に分かりやすくしている言語上での表現に過ぎません。
コンパイルされて機械語になった時点では全て2進数(4ビットをまとめて16進数)です。
int i = 10;
int i = 0x0a;
は等価でiの実際の内容は同じです。
printf ("%d",i);
printf ("%x",i);
で表示してみると分かります。
&演算子、>>演算子の理解も必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る