1 :
デフォルトの名無しさん:
よろしければ
2 :
デフォルトの名無しさん:05/02/01 01:32:21
C言語って強いですか?
4 :
デフォルトの名無しさん:05/02/01 02:02:23
どのくらいつよい?
ξうんこ
void (* signal(int sig, void (*func)(int)))(int);
について、どんなことをするものか教えてください。
13 :
デフォルトの名無しさん:05/02/03 15:17:43
================
Cの宣言の構文、とくに関数へのポインタを含む部分は酷評を受けることがある。
---K&R P.148
K&R P.148には以下のような記述がある。
int *f(); /* f: intへのポインタを返す関数 */
と
int (*pf)(); /* pf: intを返す関数へのポインタ */
は、この問題のいい例である。ここで * は前置演算子であり、 () より
低い優先度を持つから、正しい結合を行なわせるにはカッコが必要なのである。
ちなみに、上記の文には嘘がある。宣言の中の *, (), [] は演算子ではないし、
優先順位も、構文規則の中では演算子の優先順位とは別の箇所で定義されている。
================
補足:演算子の優先順位
Cには、数多くの演算子があり、しかもその優先順位が15段階もある。
これは、他言語と比べて極端に多いため、Cの参考書には、以下のような演算子の優先順位表がたいてい記載されている。
演算子 結合規則
() [] -> . 左から右
! ~ ++ -- + - * & (type) sizeof 右から左
* / % 左から右
この中で、優先順位が「最強」である ()について、
()は、プログラマが、文法で規定された優先順位を無視して 強制的に優先順位を設定する時に使用する括弧だ。
だから、 これの優先順位が最強なのは当然だ。
と考えている人は意外に多いが、それは 間違いである。もし、この ()がそのような意味なら、わざわざ優先順位表に載せる必要はないはずである。
この表の() は、(K&Rにもあるように)関数呼出しを意味する演算子であり、この場合の優先順位とは func(a, b) のような関数呼出しにおいて、func と (a, b) との間の結び付きの強さを表現している。
Cでは、「関数へのポインタ」という型があり、以下のような記述が可能なので、このような優先順位が必要なのである。
================
著者は分裂症
15 :
デフォルトの名無しさん:05/02/03 16:20:26
()って関数呼び出しだったのか
なるほど、言われてみれば納得がいく
なんか感動した
operatorでオーバーロードできるもんな
19 :
デフォルトの名無しさん:05/02/18 07:43:55
>>18 C言語もoperatorでオーバーロードできるように拡張されたか…
正しくはキャスト演算子か関数呼び出し演算子かと。
あっと、優先順位の一番上は関数呼び出し演算子だね。
exitってどういう時に使うものなんですか
あとC言語にboolってありましたっけ
>>22 >exit()
main()以外から明示的にOSに脱出したいとき。
>bool
C99なら stdbool.h そうでなくても作っておけばいい。
なるほど
あとよくサンプルコードでfopen失敗したときに、よくexit(1)ってやってますけど
あれってreturn 0だと駄目なんですか
解決しました
すみません