【初心者お断り】ガチ規格準拠C専用スレ Part133
at TECH
[前50を表示]
250:デフォルトの名無しさん
08/05/22 01:22:46
俺言語の話なんかする奴が悪いな
251:デフォルトの名無しさん
08/05/22 04:36:43
俺言語君の知識は、最近のCPUは速いって事だけだったからな。
反論する余地は無いな、たしかに。
252:デフォルトの名無しさん
08/05/22 07:42:58
お前らも煽るな
253:デフォルトの名無しさん
08/05/22 10:44:54
大勢のフリした一人だろ。煽っているのは。
254:デフォルトの名無しさん
08/05/22 11:51:11
おやそくの一言が出ました。
255:デフォルトの名無しさん
08/05/22 11:55:57
お夜食?
256:デフォルトの名無しさん
08/05/22 12:18:30
↓ タイプミスをプギャーして勝ち誇るAAをどーぞ
257:デフォルトの名無しさん
08/05/22 12:19:49
m9(^д^)
258:デフォルトの名無しさん
08/05/22 17:41:00
ぐぐってもプギャーの意味分からなかった。
259:デフォルトの名無しさん
08/05/22 22:44:05
> 俺言語君の知識は、最近のCPUは速いって事だけだったからな。
> 反論する余地は無いな、たしかに。
にもかかわらず反論してた爺は哀れだな。(w
260:デフォルトの名無しさん
08/05/23 05:38:05
いつまでも爺爺言ってる奴が根に持ちすぎてて怖い
将来犯罪起こしそうだな
261:デフォルトの名無しさん
08/05/23 07:38:27
脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。
262:デフォルトの名無しさん
08/05/23 23:57:40
>>261
> 脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。
>> 反論してた
爺は日本語も不自由らしい。(w
263:デフォルトの名無しさん
08/05/24 01:01:27
俺言語の話してるのに、C言語の話だと思って反論してやんのプギャー
こうですね、よくわかります。
264:デフォルトの名無しさん
08/05/24 01:50:10
ひっかかった、くやしいムキー。
こうですね、よくわかります。
265:デフォルトの名無しさん
08/05/24 02:09:10
いつまでやってんの!
266:デフォルトの名無しさん
08/05/24 02:26:07
ケンカはやめて(><)
267:デフォルトの名無しさん
08/05/24 11:46:20
爺で検索すればいいからわかりやすいな
268:デフォルトの名無しさん
08/05/24 17:49:54
C89 との違いのみを完全に全て列挙したような資料ってありますか?
269:デフォルトの名無しさん
08/05/24 17:51:43
C89 と C99 との違い・・・です。
270:デフォルトの名無しさん
08/05/24 18:03:32
完全かどうかは知らないけど
URLリンク(seclan.dll.jp)
とか
271:デフォルトの名無しさん
08/05/26 17:40:59
!0の値は1ですか?不定ですか?
272:デフォルトの名無しさん
08/05/26 17:42:57
1です
273:デフォルトの名無しさん
08/05/26 17:49:09
ありがとう
274:デフォルトの名無しさん
08/05/26 19:06:31
>>270
結構詳しいですが、完全なんですかね・・・。
何か漏れがあるとかいう話はないんでしょうか。
275:デフォルトの名無しさん
08/05/28 22:52:00
究極的にはC99の規格票買ってきて突き合わせるしかないだろ
276:デフォルトの名無しさん
08/06/01 12:22:33
意味情報を利用しても、C (C89) の文法はLALR(2)ではないかという
疑問がありますので質問です。
構文規則はK&Rのものしか参照できないので、もしかしたら仕様書の
ものと違うかもしれないのですが、
compound-statement:
{ declaration-list_opt statement-list_opt }
という構文規則で、
int foo;
typedef int foo; /* 型名とグローバル変数の名前空間は独立 */
void bar(void)
{
foo ?? /* ?? を読むまで、fooは宣言の一部であるとしてシフトするか、
文の一部であるとして、宣言を空にリダイレクションするか、決められない */
と思うのですが、間違いがどこかにありますでしょうか?
277:デフォルトの名無しさん
08/06/01 12:30:47
>型名とグローバル変数の名前空間は独立
この仮定が間違ってる。
278:デフォルトの名無しさん
08/06/01 12:57:24
型名も変数名も全て「一般の識別子」だよ
違うのは構造体タグだろ
279:デフォルトの名無しさん
08/06/01 15:10:44
識別子と言うことと、名前空間の管理は全然別の話だよ。
280:デフォルトの名無しさん
08/06/01 16:14:06
Cの名前空間は4種類。
・ラベル
・タグ
・メンバ
・その他すべて(typedefした型名や一般の変数の名前を含む)
つまり二つのfooは同じ名前空間を持つ。
これを同じスコープ(この場合ファイルスコープ)で使ったら当然衝突する。
スコープが異なるなら識別子の優先順位と隠蔽によってまったく問題なく処理できる。
281:デフォルトの名無しさん
08/06/01 17:07:45
C言語 名前空間 でググルとほとんどどんぴしゃの内容が...
URLリンク(uyota.asablo.jp)
282:デフォルトの名無しさん
08/06/01 17:11:45
>>281
まちがってるなぁ
そこでa a;が許されるのはスコープが違うからであって名前空間が違うからじゃない
283:デフォルトの名無しさん
08/06/01 20:47:48
グローバルな型名はローカル変数名でシャドウされる?
284:デフォルトの名無しさん
08/06/01 21:40:28
されるよ。
285:284
08/06/01 21:43:56
たとえば、
typedef int a;
a main(){
a a;
a b; // error
return 0;
}
286:デフォルトの名無しさん
08/06/02 05:48:23
型を宣言するとき
defineではなくtypedefを使わないといけない明確な理由って
なんですか?
今まで普通に使ってきたけど、新人にどう説明すればいいか
悩んでいます。
287:デフォルトの名無しさん
08/06/02 06:04:08
>>286
typedef char * pchar;
pchar a, b;
sizeof(b)=?
#define pchar char *
pchar a, b;
sizeof(b)=?
288:デフォルトの名無しさん
08/06/02 06:38:47
>>286
あと、たとえば型size_tを要求する関数があったとして、
#define size_t int
とかやると、size_tの変数を渡してもintで宣言した変数渡しても、コンパイラには区別がつかない。
289:デフォルトの名無しさん
08/06/02 07:12:47
>>286
typedef char *pchar;
const pchar a; → a が const
#define pchar char *
const pchar a; → *a が const
主にポインタ関連で困ったことになる。
290:デフォルトの名無しさん
08/06/02 13:46:28
>>288
もともとCのtypedefは弱いtypedefだから区別ないけどね
291:デフォルトの名無しさん
08/06/02 13:48:33
>>286
関数ポインタ形とか配列型だと、構文の都合上で#defineではできないってのもあるね。
292:デフォルトの名無しさん
08/06/02 21:08:43
defineじゃデバッグ時にこまるじゃん
293:デフォルトの名無しさん
08/06/02 23:22:48
typedefにはスコープがある。
defineには無い。
294:デフォルトの名無しさん
08/06/03 21:24:03
typedefにはスープがある。
defineには無い。
295:デフォルトの名無しさん
08/06/04 01:19:44
define には名前空間がない。
296:デフォルトの名無しさん
08/06/04 07:28:02
typedefにも名前空間はない
297:デフォルトの名無しさん
08/06/04 07:44:55
我輩には名前がない。
298:デフォルトの名無しさん
08/06/04 10:16:06
うちの女房にゃひげがある
299:デフォルトの名無しさん
08/06/04 17:02:02
さぁみんな、微妙に勘違いする仕事に戻るんだ!
300:デフォルトの名無しさん
08/06/04 21:50:30
C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
こうですね、わかります
301:デフォルトの名無しさん
08/06/05 21:54:55
全てのビットが0のポインタを得るにはどうすればいいでしょうか。
次のようなのを考えましたがなんかイマイチ。
void *p;
p = (void*)(1-1);
p = (void*)!1;
p = (char*)1-1;
memset(&p, 0, sizeof p);
302:デフォルトの名無しさん
08/06/05 22:00:00
この中では memset(&p, 0, sizeof p); が最も確実。
上の2つはもしかしたら上手くいかないかもしれない。
3つ目は明らかに間違い。
303:デフォルトの名無しさん
08/06/05 22:21:41
いや、3つ目もいいんじゃないか?
304:デフォルトの名無しさん
08/06/05 22:27:52
一番下以外は未定義動作
305:デフォルトの名無しさん
08/06/05 23:23:38
こういうのは?
p = (void*)(int)0;
306:デフォルトの名無しさん
08/06/05 23:27:42
整数をポインタにキャストした場合の動作は定義されない。
307:デフォルトの名無しさん
08/06/05 23:58:57
>>306 んなこたーない。
308:デフォルトの名無しさん
08/06/06 00:40:19
ポインタ型は、(何らかの)整数型と情報を失わずに相互変換できる。
309:デフォルトの名無しさん
08/06/06 00:41:02
別に0というリテラルがヌルポインタとして使えると定義されてるわけじゃないぞ。
コンパイル時に0になると決定できる定数式は全部ヌルポインタとして使える。
だから
p = (void*)(1-1);
p = (void*)!1;
はヌルポインタ。
310:デフォルトの名無しさん
08/06/06 11:28:03
>>309
だから、NULLポインタは全ビット0とは限らない、って話だろうが
311:デフォルトの名無しさん
08/06/06 11:38:15
だから上二つは上手くいく保証がないってことだろ
312:デフォルトの名無しさん
08/06/06 20:05:28
上3つでねーの
313:デフォルトの名無しさん
08/06/06 22:02:13
memset() の第2引数が定数の0だと本当にビットパターンが0になるの?
bzero() がもともとそういう仕様だから確実じゃない?
314:デフォルトの名無しさん
08/06/06 22:09:41
>>313
もちろん。関数の引数は常に値渡しだ。
ということは memset() が受け取った値0は必ず変数に代入されて処理される。
変数0がヌルポインタに変換されることは絶対にない。
315:デフォルトの名無しさん
08/06/06 22:25:46
> void *memset(void *s, int c, size_t n);
> memset() は s で示されるメモリ領域の先頭から n バイトを c で埋める。
man にはこれくらいしか書いていないけど、c が int だと意味が分かりにくい。
一旦 c が char に変換されてから n バイト書き込むということか?
316:デフォルトの名無しさん
08/06/06 22:42:53
1の補数表現を許しているから
"0"が"+0"や"-0"という場合があって
それで(charにして)埋めた場合にどうか、という話だろうな。
俺は知らん。
317:デフォルトの名無しさん
08/06/06 23:38:36
>>316
考えにくいけど、もし通常の定数0が-0だったとしても、
ヌル文字が全ビットゼロであることが保証されているから、
少なくとも文字定数\0は全ビット0のはずだね
というわけでmemsetでゼロクリアするときは\0を使おう
318:デフォルトの名無しさん
08/06/06 23:43:20
なんでわざわざ難しく考えるんだ?
実際、仕事でプログラムを作るときは仕様などを考えることに
時間を割くのに、お前達はコーディングに時間を割きそうだな。
319:デフォルトの名無しさん
08/06/06 23:48:20
プログラム板で仕様を語ってどうするよ
ここはガチ規格スレだぜ
320:デフォルトの名無しさん
08/06/07 00:54:09
糞仕様書のせいでコーディングに時間を割かなければいけないことならよくあります。
321:デフォルトの名無しさん
08/06/07 13:04:29
>>311
違う。
上手くいかない保証があるってことだ。
322:デフォルトの名無しさん
08/06/07 13:06:28
>>317
通常の整数定数0の全ビットが0であることも保証されていると記憶しているが。
323:デフォルトの名無しさん
08/06/07 13:11:35
定数の全ビットが0でもメモリに記憶されたときもそうなるの?
324:デフォルトの名無しさん
08/06/07 14:10:15
>>321
上手くいかない保証って...、なんだそりゃ。
325:デフォルトの名無しさん
08/06/07 17:28:14
>>323
ならなかったらビット演算で死ねるだろ
326:デフォルトの名無しさん
08/06/07 18:22:05
メモリ上でどうなっていても演算の結果が正しければいいんだよ。
327:デフォルトの名無しさん
08/06/07 21:29:54
C で言う所のメモリ上のビット配列ってのは
整数型の変数でビット演算によって参照できる値だっしょ。
328:デフォルトの名無しさん
08/06/08 14:47:38
C89で、名前は同じで引数の有無や個数が異なるマクロを複数定義することって認められてたっけ?
つまり、
#define A 0
#define A(x) x
329:デフォルトの名無しさん
08/06/08 14:52:31
前スレで話が出て、できるってことだったような
330:デフォルトの名無しさん
08/06/08 15:12:28
gcc でエラーになるけど。
331:デフォルトの名無しさん
08/06/08 15:14:47
>>329
情報d
前スレ見てきたところ、同じ名前のマクロを同時に複数定義することはできないと書いてあったわ。
332:デフォルトの名無しさん
08/06/08 15:53:16
>>331
ごめん完璧まちがって記憶してたわ
333:デフォルトの名無しさん
08/06/08 16:17:14
ここにいる人って、アプリ屋?それともファーム屋?
なんか、話だけを見ると、アプリ屋のほうが多いような気が・・・
334:デフォルトの名無しさん
08/06/08 16:20:07
>>333 その区別に何の意味がある?区別のしかたもよくわからんしな。
335:デフォルトの名無しさん
08/06/08 17:53:26
まるでファーム屋が多くて然るべきだと言いたげに読めるのは、俺の日本語力が弱いせいですか?
336:デフォルトの名無しさん
08/06/08 18:12:04
スレ違いだと思う
337:デフォルトの名無しさん
08/06/08 19:18:53
ファーム屋(笑)
338:デフォルトの名無しさん
08/06/08 19:21:21
マ板でやれ
339:デフォルトの名無しさん
08/06/08 19:42:49
俺はいわゆるファーム屋だが、
アプリ屋>>>>>ファーム屋
という印象がある。
はっきりいって、組込みソフト開発者はC言語と少しのハードウェア知識があれば、
あとは、仕様理解で仕事ができる。
様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
340:デフォルトの名無しさん
08/06/08 20:34:39
組み込み系のスレあたりを見てる印象だと、
組み込み屋には実装至上主義で、仕様ナニソレ、という雰囲気がある。
このスレにいるのは、なんちゃってであっても自分で処理系を書いたり
したことがあるような、アプリよりはシステム寄りの人が多いんでは?
341:デフォルトの名無しさん
08/06/08 21:19:06
そりゃ偏見だ。
アプリ屋だろうがファーム屋だろうが底辺を見ればやっぱり底辺。
上をみればちゃんとしたひとも居る。
ただ、ちゃんとしたアプリ屋がシステム方面に行ってしまうのと同様に
ちゃんとしたファーム屋はハードに行っちゃう事が多い。
342:デフォルトの名無しさん
08/06/08 21:33:49
最近組み込みは年々ハードが高性能化、開発サイクルの短期化で、
少人数の職人的な開発者での開発は限界に来てますよ
これからはアプリに近い開発方法論でやっていこうという欧米の流れ
343:デフォルトの名無しさん
08/06/08 22:49:36
>>339
> 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
新しい技術って Ajax とか Web 2.0 とかのこと?
まあ、そう言う新しい言葉を理解するのも技術力のひとつではあるが。
344:デフォルトの名無しさん
08/06/08 23:12:15
…(^^;;
345:デフォルトの名無しさん
08/06/08 23:54:00
>様々な新しい技術を吸収し、
訳:新しくリリースされたアプリの使い方を覚えて、
346:デフォルトの名無しさん
08/07/02 21:38:00
アプリ屋の俺から言わせてもらえば、
アプリ屋→頭ゆるゆるで使えない奴が多い
ファーム屋→頭かたすぎて使えない奴が多い
347:デフォルトの名無しさん
08/07/02 22:09:04
自称技術者の93.2%は使えないから、そんなもんhだろう。
348:デフォルトの名無しさん
08/08/06 14:15:43
int a = 3; { int a = a; printf( "%d", a ); }
このとき表示される数字は 3 ですか?それとも不定ですか?
JIS X 3010-1993 を少し読んだんですが分かりませんでした。
349:デフォルトの名無しさん
08/08/06 14:22:43
>>348
規格を見ずに gcc でテストしてみたところ
2147344384
と出力された
350:デフォルトの名無しさん
08/08/06 14:47:43
>>349
規格的には不定だよ. {} の中では新たなスコープが有効になるので
{} 内の a が 宣言された瞬間に {} 外の a は shadow される
# 言い方が厳密じゃないんだけど、言いたいこと分かってね
Lisp 系言語の
(let ((a 3)) (let ((a a)) (???? a))) ==> (let ((a 3)) (lambda (a) (??? a)) a)
みたいな物を, 求めてはいけない
351:349 (>>348 じゃないよ)
08/08/06 14:56:08
>>350
こういうのはOKですか?
int a = 3; { int b = a; int a = b; printf( "a=%d b=%d", a, b ); }
352:デフォルトの名無しさん
08/08/06 15:01:52
>>351 いや、だから…
言い方が悪かったのかorz
{} 外の名前が {} 内で宣言されたら shadow される
処理系によっては「{} 外の a」が意味をなす場合もあるかも知れないが
可搬なプログラムを書こうと思ったら、その事実に依存してはならない
353:349
08/08/06 15:07:08
>>352
規格では変数の宣言順序に関係なく
同一スコープ内で同名の変数が現れた場合には
外側の変数は見えなくなる
だから >>351 は次のようにしないと動作の保証ができないということですね
int a = 3; { int b = a; { int a = b; printf( "a=%d b=%d", a, b ); } }
354:デフォルトの名無しさん
08/08/06 16:13:40
JIS X 3010-1993 には以下のように書いてあるけどこれからは判断できなかった。
6.1.2.1 識別子の有効範囲
識別子は、有効範囲(scope)と呼ぶプログラムテキストの範囲にあるときだけ、可視(visible)
(すなわち、使用可能)とする。有効範囲は、関数、ファイル、ブロック、及び関数原型の4種類とする。
識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
終了する。
字句的に同一な識別子のより外側の宣言が同一の名前空間にある場合、外側の宣言は現在の
有効範囲が終了するまで不可視となり、その後再び可視となる。
二つの識別子は、有効範囲が同じ場所で終わる場合、そしてその場合に限り同じ有効範囲を持つ。
355:デフォルトの名無しさん
08/08/06 16:48:27
そうか?
はっきり書いてあると思うんだが。
356:349
08/08/06 23:17:37
>>354 を読んで解釈のひとつとして
int a, *p=&a; // これは OK
int *q=&b, b; // これは NG
ということは有効範囲とは変数の宣言順序によって変化するのではないか?
>>351 の int b=a; の時点ではブロック内で変数 a が未定義であるため
外側の a が可視だから動作が保障されるのでは?
357:デフォルトの名無しさん
08/08/06 23:58:57
いや、shadowされているが未定義である状態。
358:349
08/08/07 00:23:41
>>357
>>354 のこの部分
>識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、
>その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって
>終了する。
これは有効範囲の終わりについてのみ言及しており、
変数自体は変数宣言以降から有効になるのではないの?
359:デフォルトの名無しさん
08/08/07 00:29:19
だからそういっているんだが。
360:349
08/08/07 00:52:52
shadow されるのは
1.同一変数名の定義されているブロックの開始部分からなのか
2.それとも同一変数名が宣言された後なのか
というところで 2 で解釈可能では?
ちなみに下記のコードで gcc および Borland C++ Compiler では、警告も無し
// 出力結果は a=2.000000 *p=3 が保障される?
#include<stdio.h>
int main(){
int a=3;
{
int *p=&a;
double a=2.0;
printf("a=%f *p=%d\n", a, *p);
}
return 0;
}
361:349
08/08/07 01:15:04
>>360 の
int *p=&a;
の行が規格としては
1.エラーになるべきか
2.未定義(実装依存、鼻から悪魔)か
が知りたいのですが
>>357 さんは 2 ということでしょうか?
362:349
08/08/07 01:16:35
>>361 に追記
3.定義済み (>>360 のコードは規格に沿っている)
363:デフォルトの名無しさん
08/08/07 01:17:28
ISO の、ダウンロードできるドラフトでは >354 が引用した部分の直後にスコープの開始位置に
ついての説明があった。それによると、変数名のスコープが始まるのは変数宣言内の変数名の
直後。
ってことで >351 は OK 。
364:349
08/08/07 01:20:49
>>363
ありがとうございます
スッキリしました
これでゆっくり眠れます
最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5330日前に更新/70 KB
担当:undef