問題タブ [kernighan-and-ritchie]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
kernighan-and-ritchie - K&R 演習 2-6 で実際に求められている機能は何ですか?
演習 2-6. 位置 p から始まる n ビットを y の右端 n ビットに設定して x を返す関数 setbits(x,p,n,y) を作成し、他のビットは変更しません。
私はこの機能を紙の上で1、2時間いじろうとしてきましたが、どこにも行きません.
私が関数を解釈する方法は、任意の長さのビット フィールド x は、右端のn
ビットから開始するビットを調べることです。これらのビットを、任意の長さのビット フィールド y の右端のビットにある同じビットにp
変更します。n
n
例: p = 7
n = 9
x が一番上のフィールド、y が真ん中、結果が一番下のフィールドです。
任意のサイズのビット フィールドでこれを行う方法を判断するのに苦労しています。使用するsizeof(x) * 8
必要がありますか、それとも不要ですか?
このような関数を作成する方法について、ヒントをいただければ幸いです。
また、演習の他の解釈も知りたいです。おそらく、これは実行できると確信していますが、より簡単なバージョンです。時間がかかっていることを考えると、この件に関するセカンドオピニオンをいただければ幸いです。
c - EOF 演習 1-6 K&R C プログラミング言語
これは、K&R の本から直接引用したものです。
の優先順位は の優先順位
!=
よりも高くなります。つまり=
、括弧がない場合!=
、代入の前に関係テストが実行され=
ます。だから声明はと同等です
これは、getchar の呼び出しがファイルの終わりを返したかどうかに応じて、c を 0 または 1 に設定するという望ましくない効果があります。(これについては、第 2 章で詳しく説明します。)
演習 1-6。
getchar() != EOF
式が 0 または 1であることを確認します。
この演習を行う方法と、ブロック引用された段落で何が起こっているのかを理解するのに苦労しています.
EOF は int 型の記号定数であり、通常は値 -1 を保持することを知っています。負の値の int は、比較を行うときに char と同じ値を保持することはできないため、 int に昇格する必要があります。これにより、何らかの形でファイルの終わりが通知されます。
また、上記で指定された括弧がないと!=
、割り当ての前に比較が行われることもわかりますが、これは実際にはどういう意味ですか? その機能に何が起こるのですか?また、EOF の値を出力しましたが、それは -1 でした。0 または 1 であることを確認するという演習の意味は何ですか?
c - K&R C ブックの atoi 関数
K&R C 第 2 版の atoi() 関数の例に問題があります。0 から 9 までの文字のみを使用する必要があります。しかし、私のプログラムのロジックのどこかで、何か間違ったことをしています。
したがって、次の関数があります。
ここに私が得ているエラーがあります:
c - char * argv[] とはどういう意味ですか?
私は C プログラミングが初めてで、問題が発生しました。
複雑な宣言の場合、これを見つけました
これはdaytab
、配列の名前であり、配列の名前が配列の最初の要素を指すことを意味します。配列名は、などのようなポインター操作と互換性がありませんdaytab++
(間違っている場合は修正してください)。
しかし、デニス・リッチーで書かれたこのコードを見つけました
彼らはどのように操作できargv
ますか?配列名ではないでしょうか?
c - ポインターに値を代入しますか?
デニス・リッチーでこれを見つけた
これらの 4 つの式は同等です。
r.pt1.x
rp->pt1.x
(r.pt1).x
(rp->pt1).x
演算子は左から右に関連付けられるためです。
struct rect *rp = &r ではないでしょうか?
c - K&R スタイル関数定義の使用エラー
コンパイル時に次のエラーが発生しました。間違っているように聞こえますが、コンパイラが伝えようとしている正確なメッセージは何ですか: エラー: 'fun' のタイプが競合しています エラー: 以前の fun の宣言はここにありました:
c - 10 進数が割り当てられた変数が、実際の 10 進数と同じように動作しないのはどうしてでしょうか?
トリッキーな行は、char longest[]
配列の初期化です。( char longest[lim]
) のようにすると、EOF の後に返される文字列が よりも長くなるのでlim
、このままではうまくいかないと思います。しかし、そこに 10 を明示的に配置すると ( char longest[10]
) — 期待どおりに動作し、 の最初の 10 文字のみが返されline
ます。
int lim = 10; char longest[lim]
この正確なケースでは、との違いは何ですかchar longest[10]
c - ポインターの配列への argv ポインター
次の文章がそれに続くコードとどのように一致するかについて混乱しています。
argv は pointers の配列へのポインターであるため、配列にインデックスを付けるのではなく、ポインターを操作できます。この次のバリアントは、argc がカウントダウンされている間に、char へのポインターへのポインターである argv をインクリメントすることに基づいています。
char *argv[]
ポインターの配列だけではありませんか? ポインターの配列へのポインターは、char *(*argv[])
または同様のものとして記述されませんか?
余談ですが、一般的に、配列とポインターが混在する宣言がかなり混乱するのは普通のことですか?