- 1 名前:デフォルトの名無しさん mailto:sage [2008/01/24(木) 14:52:45 ]
- このスレは標準C規格や規格に合致した移植性の高い記法・技法に関するスレです。
C言語初心者の初歩的な質問、GUIなどの標準Cではできない事の質問、 ソース丸投げ、宿題、書籍 などは専門の別スレッド↓があるのでそちらへ。 C言語なら俺に聞け(入門篇) Part 24 pc11.2ch.net/test/read.cgi/tech/1201083176/ 【初心者歓迎】C/C++室 Ver.47【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1200464091/ C/C++の宿題を片付けます 103代目 pc11.2ch.net/test/read.cgi/tech/1200318925/ 【書き込む前に】 ・まず問題を冷静に吟味してCの話か否かをはっきりさせてから質問しましょう。 ・質問する前には最低限検索を。 ・エラー(警告含む)が起きたのならばエラーメッセージを書きましょう。 【参考文献】 C FAQ 日本語訳 www.kouno.jp/home/c_faq/ Cプログラマ必読 ・プログラミング言語C(通称 K&R) www.amazon.co.jp/exec/obidos/ASIN/4320026926/250-7563469-9920244 【このスレのログ】 前スレ:pc11.2ch.net/test/read.cgi/tech/1190261457/ 他の過去ログ:nssearch.hp.infoseek.co.jp/clang/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
- 316 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:42:53 ]
- 1の補数表現を許しているから
"0"が"+0"や"-0"という場合があって それで(charにして)埋めた場合にどうか、という話だろうな。 俺は知らん。
- 317 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:38:36 ]
- >>316
考えにくいけど、もし通常の定数0が-0だったとしても、 ヌル文字が全ビットゼロであることが保証されているから、 少なくとも文字定数\0は全ビット0のはずだね というわけでmemsetでゼロクリアするときは\0を使おう
- 318 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:43:20 ]
- なんでわざわざ難しく考えるんだ?
実際、仕事でプログラムを作るときは仕様などを考えることに 時間を割くのに、お前達はコーディングに時間を割きそうだな。
- 319 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 23:48:20 ]
- プログラム板で仕様を語ってどうするよ
ここはガチ規格スレだぜ
- 320 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 00:54:09 ]
- 糞仕様書のせいでコーディングに時間を割かなければいけないことならよくあります。
- 321 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:04:29 ]
- >>311
違う。 上手くいかない保証があるってことだ。
- 322 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:06:28 ]
- >>317
通常の整数定数0の全ビットが0であることも保証されていると記憶しているが。
- 323 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 13:11:35 ]
- 定数の全ビットが0でもメモリに記憶されたときもそうなるの?
- 324 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 14:10:15 ]
- >>321
上手くいかない保証って...、なんだそりゃ。
- 325 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 17:28:14 ]
- >>323
ならなかったらビット演算で死ねるだろ
- 326 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 18:22:05 ]
- メモリ上でどうなっていても演算の結果が正しければいいんだよ。
- 327 名前:デフォルトの名無しさん mailto:sage [2008/06/07(土) 21:29:54 ]
- C で言う所のメモリ上のビット配列ってのは
整数型の変数でビット演算によって参照できる値だっしょ。
- 328 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:47:38 ]
- C89で、名前は同じで引数の有無や個数が異なるマクロを複数定義することって認められてたっけ?
つまり、 #define A 0 #define A(x) x
- 329 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 14:52:31 ]
- 前スレで話が出て、できるってことだったような
- 330 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:12:28 ]
- gcc でエラーになるけど。
- 331 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:14:47 ]
- >>329
情報d 前スレ見てきたところ、同じ名前のマクロを同時に複数定義することはできないと書いてあったわ。
- 332 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 15:53:16 ]
- >>331
ごめん完璧まちがって記憶してたわ
- 333 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:17:14 ]
- ここにいる人って、アプリ屋?それともファーム屋?
なんか、話だけを見ると、アプリ屋のほうが多いような気が・・・
- 334 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 16:20:07 ]
- >>333 その区別に何の意味がある?区別のしかたもよくわからんしな。
- 335 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 17:53:26 ]
- まるでファーム屋が多くて然るべきだと言いたげに読めるのは、俺の日本語力が弱いせいですか?
- 336 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 18:12:04 ]
- スレ違いだと思う
- 337 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:18:53 ]
- ファーム屋(笑)
- 338 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:21:21 ]
- マ板でやれ
- 339 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 19:42:49 ]
- 俺はいわゆるファーム屋だが、
アプリ屋>>>>>ファーム屋 という印象がある。 はっきりいって、組込みソフト開発者はC言語と少しのハードウェア知識があれば、 あとは、仕様理解で仕事ができる。 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。
- 340 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 20:34:39 ]
- 組み込み系のスレあたりを見てる印象だと、
組み込み屋には実装至上主義で、仕様ナニソレ、という雰囲気がある。 このスレにいるのは、なんちゃってであっても自分で処理系を書いたり したことがあるような、アプリよりはシステム寄りの人が多いんでは?
- 341 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:19:06 ]
- そりゃ偏見だ。
アプリ屋だろうがファーム屋だろうが底辺を見ればやっぱり底辺。 上をみればちゃんとしたひとも居る。 ただ、ちゃんとしたアプリ屋がシステム方面に行ってしまうのと同様に ちゃんとしたファーム屋はハードに行っちゃう事が多い。
- 342 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 21:33:49 ]
- 最近組み込みは年々ハードが高性能化、開発サイクルの短期化で、
少人数の職人的な開発者での開発は限界に来てますよ これからはアプリに近い開発方法論でやっていこうという欧米の流れ
- 343 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 22:49:36 ]
- >>339
> 様々な新しい技術を吸収し、開発しているアプリ屋のほうが技術は高い。 新しい技術って Ajax とか Web 2.0 とかのこと? まあ、そう言う新しい言葉を理解するのも技術力のひとつではあるが。
- 344 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:12:15 ]
- …(^^;;
- 345 名前:デフォルトの名無しさん mailto:sage [2008/06/08(日) 23:54:00 ]
- >様々な新しい技術を吸収し、
訳:新しくリリースされたアプリの使い方を覚えて、
- 346 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:38:00 ]
- アプリ屋の俺から言わせてもらえば、
アプリ屋→頭ゆるゆるで使えない奴が多い ファーム屋→頭かたすぎて使えない奴が多い
- 347 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 22:09:04 ]
- 自称技術者の93.2%は使えないから、そんなもんhだろう。
- 348 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:15:43 ]
- int a = 3; { int a = a; printf( "%d", a ); }
このとき表示される数字は 3 ですか?それとも不定ですか? JIS X 3010-1993 を少し読んだんですが分かりませんでした。
- 349 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 14:22:43 ]
- >>348
規格を見ずに gcc でテストしてみたところ 2147344384 と出力された
- 350 名前:デフォルトの名無しさん mailto:sage [2008/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 じゃないよ) mailto:sage [2008/08/06(水) 14:56:08 ]
- >>350
こういうのはOKですか? int a = 3; { int b = a; int a = b; printf( "a=%d b=%d", a, b ); }
- 352 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 15:01:52 ]
- >>351 いや、だから…
言い方が悪かったのかorz {} 外の名前が {} 内で宣言されたら shadow される 処理系によっては「{} 外の a」が意味をなす場合もあるかも知れないが 可搬なプログラムを書こうと思ったら、その事実に依存してはならない
- 353 名前:349 mailto:sage [2008/08/06(水) 15:07:08 ]
- >>352
規格では変数の宣言順序に関係なく 同一スコープ内で同名の変数が現れた場合には 外側の変数は見えなくなる だから >>351 は次のようにしないと動作の保証ができないということですね int a = 3; { int b = a; { int a = b; printf( "a=%d b=%d", a, b ); } }
- 354 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:13:40 ]
- JIS X 3010-1993 には以下のように書いてあるけどこれからは判断できなかった。
6.1.2.1 識別子の有効範囲 識別子は、有効範囲(scope)と呼ぶプログラムテキストの範囲にあるときだけ、可視(visible) (すなわち、使用可能)とする。有効範囲は、関数、ファイル、ブロック、及び関数原型の4種類とする。 識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、 その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって 終了する。 字句的に同一な識別子のより外側の宣言が同一の名前空間にある場合、外側の宣言は現在の 有効範囲が終了するまで不可視となり、その後再び可視となる。 二つの識別子は、有効範囲が同じ場所で終わる場合、そしてその場合に限り同じ有効範囲を持つ。
- 355 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 16:48:27 ]
- そうか?
はっきり書いてあると思うんだが。
- 356 名前:349 mailto:sage [2008/08/06(水) 23:17:37 ]
- >>354 を読んで解釈のひとつとして
int a, *p=&a; // これは OK int *q=&b, b; // これは NG ということは有効範囲とは変数の宣言順序によって変化するのではないか? >>351 の int b=a; の時点ではブロック内で変数 a が未定義であるため 外側の a が可視だから動作が保障されるのでは?
- 357 名前:デフォルトの名無しさん mailto:sage [2008/08/06(水) 23:58:57 ]
- いや、shadowされているが未定義である状態。
- 358 名前:349 mailto:sage [2008/08/07(木) 00:23:41 ]
- >>357
>>354 のこの部分 >識別子を宣言する宣言子又は型指定子がブロック内又は関数定義の仮引数宣言子の並びに現れる場合、 >その識別子はブロック有効範囲(block scope)をもち、その範囲は対応するブロックを閉じる}によって >終了する。 これは有効範囲の終わりについてのみ言及しており、 変数自体は変数宣言以降から有効になるのではないの?
- 359 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 00:29:19 ]
- だからそういっているんだが。
- 360 名前:349 mailto:sage [2008/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 mailto:sage [2008/08/07(木) 01:15:04 ]
- >>360 の
int *p=&a; の行が規格としては 1.エラーになるべきか 2.未定義(実装依存、鼻から悪魔)か が知りたいのですが >>357 さんは 2 ということでしょうか?
- 362 名前:349 mailto:sage [2008/08/07(木) 01:16:35 ]
- >>361 に追記
3.定義済み (>>360 のコードは規格に沿っている)
- 363 名前:デフォルトの名無しさん mailto:sage [2008/08/07(木) 01:17:28 ]
- ISO の、ダウンロードできるドラフトでは >354 が引用した部分の直後にスコープの開始位置に
ついての説明があった。それによると、変数名のスコープが始まるのは変数宣言内の変数名の 直後。 ってことで >351 は OK 。
- 364 名前:349 mailto:sage [2008/08/07(木) 01:20:49 ]
- >>363
ありがとうございます スッキリしました これでゆっくり眠れます
|

|