- 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/ 【このスレ住人としての心得】 わざとスレ違いあるいはごく低レベルな質問を繰り返して 流れを妨害する荒らしがいます。適当に誘導して放置してください。
- 37 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 05:18:37 ]
- つーかC99完全準拠の環境なんてあるのか?現状
- 38 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:28:23 ]
- Comeau の準拠状況ってどうなんだろうか?
- 39 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:30:35 ]
- >>37
Intel C++は100%C99標準準拠だよ
- 40 名前:デフォルトの名無しさん [2008/01/31(木) 13:02:51 ]
- C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
- 41 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:03:31 ]
- >>40
スレタイ読め
- 42 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 13:26:45 ]
- >>41
ビットシフトはなんの役に立つのでしょうか でぐぐれ
- 43 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 19:47:50 ]
- >>40 ビット単位でシフトしたい時に役に立つ
- 44 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 15:53:26 ]
- >>42
やっぱりこれテンプレにいれとかないとダメだな
- 45 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 20:16:45 ]
- ビットシフトはなんの役に立つのでしょうかでググれ に一致する日本語のページ 約 766 件
- 46 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 21:02:34 ]
- >>34
gcc.gnu.org/c99status.html
- 47 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:48:40 ]
- ふと思ったんだが…
各種処理系のヘッダで NULL が以下のように宣言されているのはなぜ? #if !defined(__cplusplus) #define NULL ((void *)0) #else #if defined(__LP64__) #define NULL (0L) #else #define NULL 0 #endif /* __LP64__ */ #endif /* !__cplusplus */ つか, C でも (void *)にキャストする必要はないと思われるんだが, (void*)にキャストしておくとなんかご利益あったりする?
- 48 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:55:00 ]
- int p = NULL; がエラーになる。
- 49 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 17:58:48 ]
- NULLを'\0'と間違えて使うような馬鹿を摘発したりとか、型チェックの面でご利益がある。
- 50 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:01:20 ]
- #if defined(__LP64__)
#define NULL (0L) これ処理系依存っぽくて鬱陶しいな
- 51 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:03:41 ]
- 処理系自身がそう定義してるのなら
その処理系で大丈夫っつーことだから問題はないだろう
- 52 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:04:07 ]
- >>50
printf の可変長引数対策じゃないか?
- 53 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:06:36 ]
- つーかそういう処理系依存を覆い隠すためにヘッダがあるわけで
ヘッダの定義をのぞき見てあれこれ言っても このスレ的に意味があるのか疑わしい
- 54 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 19:06:54 ]
- 処理系定義であるポインタのサイズを、NULLの定義の形を借りて記述しているんだよ
- 55 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:16:17 ]
- ポインタのサイズが型ごとに異なったりする処理系もあるんじゃなかった?
- 56 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 20:58:41 ]
- MS-DOSのミディアムモデルやコンパクトモデルが典型的だな
- 57 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:18:16 ]
- 型ごとにというかデータのポインタとコードのポインタのサイズが違う事はあるな
関数ポインタと通常のポインタに互換性がないのはそのため
- 58 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 00:51:14 ]
- pimpl パターンとか見てる分には
データ同士だとポインタのサイズはかわらないはずだとは思ってるが、 規格のどこに書いてあるかとかは知らんなあ。
- 59 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 01:46:52 ]
- pimplのどこに異種ポインタの変換が介在するのですかね。
- 60 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:53:14 ]
- スレ違い
- 61 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 02:57:46 ]
- 変換は関係ないだろう。
構造体/クラスの中身が分からなくても ポインタのサイズが決まるようじゃないと pimpl パターンは使えないという話だ。 ただ、組み込み型との間でもサイズが等しいかどうかは分からんね。 これだけだと。
- 62 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:15:44 ]
- 構造体/クラスの宣言(通常はヘッダファイル)があれば型が分かるから
中身見なくてもポインタのサイズは決まると思う
- 63 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 05:38:48 ]
- ポインタのサイズって32bitCPUなら4バイト固定だと思ってた
- 64 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 10:02:56 ]
- Intel + Windows で 16-bit アプリケーションなら 32-bit CPU でも
2 バイトのポインタが使われたりする が 32-bit アプリケーションならポインタは 4 バイト固定 要するに CPU 依存でなくコンパイラ依存 void* と int* でサイズが違う処理系があるらしいが見てみたいな
- 65 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:06:04 ]
- void* (char*) と int* でアドレッシングが違う処理系があると聞いたが、
それの間違いではなくて?
- 66 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 11:11:12 ]
- 規格ではポインタのサイズはどこまで規定されている?
構造体型を指すポインタのサイズはすべて等しい?
- 67 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:20:19 ]
- 処理系依存ってことはつまり、ユーザープログラムより下にあるコンパイラからアーキテクチャから
すべてひっくるめて依存。データ型についてうるさいアーキテクチャもあるかもしれない。 (タグビットでデータ型を指定するような) 仕様では、6.3.2.3 で、任意のデータ型へのポインタから void * へ、 void * にしたものから元の型へ、という変換は保証されることになっている。 (関数へのポインタに関しては規定がない) 整数と任意のポインタ(関数へのポインタ含む)との変換は、処理系定義。 ポインタを入れることができる整数の型として intptr_t(uintptr_t) が 7.18.1.4 に。
- 68 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:46:07 ]
- >>66
> 構造体型を指すポインタのサイズはすべて等しい? 少なくとも、これは処理系によらず保証されている。
- 69 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:58:44 ]
- 同サイズの整数型限定だっけ? >整数/ポインタ キャスト
intptr_t はどのポインタと等しいサイズの整数型なんだろう。 それとも、全てのポインタ型のサイズが等しいと保証されているのか?
- 70 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:00:06 ]
- intptr_tはポインタを格納できればいいのであって、
ポインタと同じ大きさである必要は無いだろう。
- 71 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:04:23 ]
- >>69-70
(u)intptr_tに変換できるのはvoid*だけ。 int i = 42; intptr_t p = (void*)&i; int j = *(int*)(void*)p;
- 72 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:39:20 ]
- そしてobjectを指すポインタであればどれでも、voidへのポインタに変換後、元に戻せる。
つまり、voidへのポインタのサイズは少なくとも関数ポインタ以外のすべてのポインタ以上。
- 73 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:06:00 ]
- >>71
70に対する反論になっていない
- 74 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:28:45 ]
- 反論したつもりはないよ。
- 75 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:54:06 ]
- なるほど。
基本型同士、あるいは基本型と構造体型との間で ポインタのサイズが違ってても良さそうではあるな。
- 76 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:16:41 ]
- int *とunsigned int*みたいな、指示先型の符号の有無だけが異なる場合、ポインタのサイズは等しい。
- 77 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:18:39 ]
- >>74
じゃあ何で一見関係ありそうで全然関係ない話をしたの?
- 78 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:33:08 ]
- >>77
>>69
- 79 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:35:13 ]
- >>77
何でアンカー間違えただけでそんなに責められないといけないんですか><
- 80 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 19:59:51 ]
- 先に「間違えた」と言わないから。
- 81 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:58:01 ]
- >>79
条件の後出しはやめろと。
- 82 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:19:53 ]
- いじめが好きな人達が集まるスレ
- 83 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:56:02 ]
- といいつつ自分の非を棚に挙る人が責められるスレ
- 84 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 20:48:59 ]
- >>82-83
それはどのスレでもそう
- 85 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 15:22:26 ]
- ふと気になったんだけど
>50の、0Lをかっこでくくる必要あるの?
- 86 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:02:18 ]
- >>85
#include <stdio.h> #define HOGE 0L #define CAT2(a, b) a ## b #define CAT1(a, b) CAT2(a, b) #define CAT(a, b) CAT1(a, b) #define STR2(a) # a #define STR1(a) STR2(a) #define STR(a) STR1(a) int main() { long double a = CAT(0., HOGE); printf("%Lf\n", a); printf("%s\n", STR(CAT(0., HOGE))); return 0; }
- 87 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:43:53 ]
- マクロNULLをトークン連結演算子に投げ込むような状況があるとは思えんが
- 88 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:45:36 ]
- そういう問題じゃない
- 89 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:50:11 ]
- あってもこまらないし
あればもしかしたら役に立つかもしれないから 一般的にはある必要はない
- 90 名前:デフォルトの名無しさん mailto:sage [2008/02/18(月) 20:51:38 ]
- あってもこまらないし
あればもしかしたら役に立つかもしれないから とりあえずつけておけ
- 91 名前:デフォルトの名無しさん [2008/02/19(火) 23:04:55 ]
- 超カメレスなんだが >>64
ワードアドレッシングのマシンの場合, ワードアドレス + オフセット ここで, ワードアドレス == レジスタサイズ が, バイトポインタになり得ますが…
- 92 名前:デフォルトの名無しさん [2008/02/20(水) 14:01:41 ]
- 可変引数型の関数にいくつ引数が入力されたか、
数える方法はありますか?
- 93 名前:デフォルトの名無しさん mailto:sage [2008/02/20(水) 14:09:30 ]
- 標準では、ない
- 94 名前:92 [2008/02/20(水) 14:44:34 ]
- >93
サンクス
- 95 名前:デフォルトの名無しさん mailto:sage [2008/02/21(木) 23:25:37 ]
- そう言えばさぁ...
左辺がキャストできなくなったのは C89 からで ok ? int c; (char)c = 1; みらいやつ
- 96 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 02:33:43 ]
- *(char *)&c = 1;ならおk
ただしcharは必ず整合するけどもっと大きな型だとむやみなキャストは 境界に整合しなくなるおそれがある
- 97 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 07:32:26 ]
- それはキャストはしてるけど、
キャストした後の値に直接代入してる訳じゃないよね。
- 98 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:23:07 ]
- >>95
というかそれが出来た時期なんかあったのか どういう処理になるの?
- 99 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:30:53 ]
- >>95
少なくとも現在より前に制定された規格で、 (type)variable を左辺値として認めたものは一つもない。 たしか、gcc, msvcともにラフなモードではコンパイルとおるけど、 結果が違うようになったと思う。
- 100 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:35:11 ]
- ああ、C++で(type)が参照型なのは除く。
- 101 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 13:36:16 ]
- ちなみにC++だと(char&)c = 1って書ける。
- 102 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 19:10:21 ]
- >>98
*(char*)c = 1; と同じになった気がする。 K&R C あたりではできると聞いた事があるような気がするが、 詳しい事は俺は知らん。
- 103 名前:デフォルトの名無しさん mailto:sage [2008/02/22(金) 20:01:18 ]
- K&Rではできた。
- 104 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:50:20 ]
- Cでは符号なし整数をビットシフトすると論理シフト、符号有り整数をビットシフトすると算術シフトになるんですか?
- 105 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:53:58 ]
- 右シフトはそのとおり。
左シフトは論理/算術の区別が無い。
- 106 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:54:59 ]
- わかりました。
早いレスありがとうございます。
- 107 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:55:53 ]
- 符号あり整数をビットシフトして算術シフトになるかどうかは
C の規格では規定されていない。 ただ、実際問題そういう実装が多いだろうね。
- 108 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:57:02 ]
- unsignedは論理シフトになる
signedが算術シフトになるかどうかは処理系依存
- 109 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:59:55 ]
- 規格見直したら、負の数を右シフトしたときは結果の値が処理系定義になるって
書いてあった。つまり、算術シフトとも論理シフトとも違う結果が得られてもおかしくない わけだ。 あと、型が signed でも値が負じゃなければ unsigned と同じ動作って決められてた。
- 110 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 03:03:49 ]
- 2の補数表現じゃない環境だと
算術シフトにならない実装になってるだろうね。
- 111 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 09:37:18 ]
- ただしどうなるかは(規格準拠の処理系なら)マニュアルに明記されていなければならない
- 112 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 20:29:31 ]
- 明記されていればry
- 113 名前:デフォルトの名無しさん mailto:sage [2008/04/02(水) 23:13:23 ]
- 最近レスが無いので、ビットシフトについて質問してもいいですか?
- 114 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:24:28 ]
- 負の数の右シフトが算術シフトになるか論理シフトになるかは処理系依存です。
- 115 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:29:04 ]
- 負の数の左シフトは?
- 116 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 00:42:31 ]
- 「場合によって未定義」でいいのかな?
f4.aaa.livedoor.jp/~pointc/105/No.27873.htm のNo.27888がわかりやすく解説してくれてる。
- 117 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 02:34:20 ]
- >>116
リンク先読んだら、負の数は全部未定義としか読めない。
- 118 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 06:56:17 ]
- The behavior is undefined if the right operand is negative,
or greater than or equal to the length in bits of promoted left operand.
- 119 名前:デフォルトの名無しさん mailto:sage [2008/04/03(木) 06:57:38 ]
- それはシフト数の方の話だった。
- 120 名前:デフォルトの名無しさん mailto:sage [2008/04/04(金) 13:58:33 ]
- そろそろビットシフトの質問の出番ですか?
- 121 名前:デフォルトの名無しさん [2008/04/07(月) 21:51:36 ]
- C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
- 122 名前:デフォルトの名無しさん mailto:sage [2008/04/07(月) 22:33:59 ]
- スレ違い
- 123 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 03:27:19 ]
- 規格上未定義になってる処理を書いたら例外吐いて止まるコンパイラきぼう
いちいち覚えるの面倒
- 124 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 10:47:47 ]
- ベンダーに言え
- 125 名前:デフォルトの名無しさん mailto:sage [2008/04/08(火) 12:31:00 ]
- もしさまざまなマシンでどのように実行されるか知らなければ、
知らないということが自分を守る助けとなるかもしれ ない from K&R
- 126 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 00:45:45 ]
- 例外吐かれるより警告がうれしいな・・・
- 127 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 20:48:04 ]
- エラーでいいよ。
どうせ警告も0にしてるんだし。
- 128 名前:デフォルトの名無しさん mailto:sage [2008/04/09(水) 22:05:24 ]
- 俺は信号を見ないけど車は俺をよけて通れよ!
なんて高らかに宣言しなくても・・・
- 129 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:31:25 ]
- エラーでも警告でもアラーとでもいいけど、
そこで止まられるのは、、ちょっとやだな。
- 130 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 17:49:13 ]
- 過疎スレ
- 131 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:07:09 ]
- 結構前に、アラーメッセージというのがあったな・・・
- 132 名前:デフォルトの名無しさん mailto:sage [2008/04/10(木) 22:31:01 ]
- アッラーアクバル!
- 133 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:00:31 ]
- pc11.2ch.net/test/read.cgi/tech/1206196600/637
↑ の件なんですが、こういうことに出くわした場合、 コンパイラはどういう風に振舞わなければならないとなってるのでしょうか? それとも未定義?
- 134 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 20:55:12 ]
- >>133
未定義 コンパイラの実装依存です リンカのオプションでエラーにする設定もおそらくあります src1.c と src2.c で変数 a の型が違ってたりすると悲惨です
- 135 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 21:01:07 ]
- C の仮定義ってファイルまたぐと適用外だっけ?
- 136 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:13:29 ]
- >>134
未定義と実装依存は違うし、そもそもコンパイラにとっては正しいソース なので、 > コンパイラはどういう風に振舞わなければならないとなってるのでしょうか? 普通に振舞うだけ。 大抵の環境ではリンカでエラーになるはず。 (そのスレでは、エラーにならないと言い張ってるが。)
- 137 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:19:34 ]
- >>136
未定義なので実装依存と書けばいいの? gcc なら警告無し borland C++ compiler なら警告あり 大抵の環境って何が基準?
- 138 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:30:12 ]
- VC++2008でも警告無しだな
- 139 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:31:34 ]
- みんなあんまり適当な事言うなよ?
>>133 あまり知られていないが、これは 「仮定義(tentative definition)」 という仕様。 extern も static もついていない、初期化を伴わないグローバル変数の宣言は 「仮定義」 と見なされる。 対する、extern も static もついていない、初期化を伴うグローバル変数の宣言は 「外部定義(external definition)」 と見なされる。 外部定義は必ず実体定義を伴う。 外部定義が複数あると、二重定義となりエラーとなる。 しかし、仮定義は他に実体定義がなければ実体を定義し、 他に実体定義があれば実体定義を伴わない単なる宣言と見なされる。 複数の仮定義を書いた場合、実体は1つだけ定義され、それらの仮定義は実体を共有する。 つまり、>>133 は仕様。
- 140 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 22:35:35 ]
- ちなみにこの仕様は C++ で廃止された。
C++ では仮定義がなくなり、 extern も static もついていない、初期化を伴わないグローバル変数の宣言も 外部定義と見なされ、実体定義を伴う。 このあたりの違いの話は C++ の規格の付録に書いてある。
- 141 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:14:40 ]
- >>137
> 未定義なので実装依存と書けばいいの? 違う。 未定義は何が起っても文句を言うなと言うこと。 (実行したらPCが壊れるような実行ファイルを生成しても規格には違反しない。) 実装依存は何が起るかは環境によって違うけど、環境毎に何が起るかは決まってい ると言うこと。 >>137, >>139-140 すまん、仮定義のことすっかり忘れてた。
- 142 名前:デフォルトの名無しさん mailto:sage [2008/04/23(水) 23:23:02 ]
- 未定義は規格は挙動を定義しないということで、
何が起こっても規格に反しないということではあるが、 処理系独自に挙動を定義することまでを禁止する物でもない。 もちろん、それに頼ったコードは通常移植性が低い訳だが。 処理系依存は処理系ごとに挙動を定義することが求められている。 未規定は未定義と似ているが、 正常なコードの中で挙動がきちんと定められていないものを言う。 関数の引数に書かれた式の評価順とか。
- 143 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:20:37 ]
- 仮定義は初耳でした、勉強になりました
ありがとうございます
- 144 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:30:36 ]
- うげ、仮定義って翻訳単位跨いでも使えるのか。
知らなかった。
- 145 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 00:49:31 ]
- 本当に翻訳定義またいで使えたっけ?
- 146 名前:デフォルトの名無しさん mailto:sage [2008/04/24(木) 01:24:54 ]
- 規格を見る限り、仮定義があると翻訳単位の一番下に = 0 で初期化された宣言があると見なされるようだ。
複数の翻訳単位がある場合は二重定義になりそう?
- 147 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:08:05 ]
- >>141-142
処理系依存・実装依存は処理系定義(implementation-defined)だけじゃない。 適当なこと言うなよ。 未定義・未規定・処理系定義 どれも処理系の実装に依存してるだろ。
- 148 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:20:11 ]
- 処理系定義は実装には依存しないだろ。
- 149 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:22:21 ]
- 実装によって挙動が違うことを規格が許している、ことを
実装に依存している、と言うのであって、 処理系定義は実装に依存していると思うが?
- 150 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 14:28:03 ]
- 処理系定義は仕様としての表明であり、実装とは切り離されている。
具体的なモノとは分けて考えるべきだろう。
- 151 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:08:26 ]
- JISでは処理系と訳されてるけどimplementation definedだから「実装」だべ
- 152 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:18:25 ]
- その文脈で
>>147 >どれも処理系の実装に依存してるだろ。 の意味を説明できるのか?
- 153 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:28:53 ]
- >>147 おおむねこんな意味かい?
処理系定義: 動作も結果も保証しないがどうのような振る舞いを示すかは 処理系が保証しなければならない 未規定: 動作の保証はないし処理系の振る舞いによって何が起るかは 不明 未定義: 何が起っても文句は言えない. 処理系自体も振る舞いを規定する必要はない
- 154 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:31:09 ]
- そもそもX3010に〜依存って言葉はあるんでしょうか?
- 155 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:36:43 ]
- >>153
未規定:規格が動作を明示することを求めいていない 例)関数の実引数は、どれから評価してもよいし、明示する必要もない。
- 156 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 15:37:40 ]
- ない。
一部の人間が勝手にimplementation definedと混同してるだけ。 >>136とか>>141とか>>142とか
- 157 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 16:07:28 ]
- 「規格が明確に定義していない」には3種類あって、以下のように定義されている。
・処理系定義(implementation defined)の動作 どう動作するかを実装が選択する。そのプログラムがコンパイルできないというのは許されない。 (この構成概念を使ったプログラムは誤りというわけではない。) (実装が)何を選んだかは(コンパイラの作者が)文書にしておかなければならない。 規格が合法な動作をいくつか用意していてそこから選ぶことができるかもしれないし、 必要条件をとくに課していないかもしれない。 ・未規定(unspecified)の動作 処理系定義の動作に似ている。ただし、どういう動作を選んだかは文書にする必要がない。 ・未定義(undefined)の動作 本当に何が起きても不思議はないことを意味する。規格は何の必要条件も課さない。 コンパイルできないかもしれないし、誤った動きをするかもしれないし (クラッシュしたり黙って誤った結果を出したり)、 あるいはたまたまプログラマの意図したとおりの動きをするかもしれない。 以上、CFAQより抜粋
- 158 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 17:52:27 ]
- もうメタ議論くらいしかすることないのな
- 159 名前:デフォルトの名無しさん mailto:sage [2008/05/05(月) 21:08:20 ]
- うん。
- 160 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 01:46:45 ]
- >154 >156
ただ、CFAQには「実装依存」を「処理系定義の動作」という意味で使っている場所がある。 正確ではないが、その言葉に出くわして意味を解釈する必要があるときは、そのように読むのが一般的であるかもしれない。
- 161 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 05:08:14 ]
- それはimplementation definedの正確でない訳だったりしないの?
- 162 名前:>>136 mailto:sage [2008/05/06(火) 11:07:05 ]
- 一般的な機論において、特に混乱するわけでもないから「〜依存」って
書いてるだけ。後出しで X3010 出してきて混同してるとか言われても、 「また KY 君かよ」としか思えない。
- 163 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 11:13:34 ]
- >>161
当たったところ、原文では implementation-defined と書いてあった。 ただそもそも日本語で実装依存といった場合におおよそ何を意味するかという話であるので (だから正確でないのは承知の上であることは書いた)。
- 164 名前:デフォルトの名無しさん mailto:sage [2008/05/06(火) 22:59:28 ]
- つまり
「実装依存」は場面によって指している物が違うから implementation definedの訳としては使わないほうがよい。 ということだな。
- 165 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 00:01:21 ]
- implementationは普通に訳せば実装という意味だから処理系定義という訳もアレかもしれんがな
「実装依存」そのまんまの意味であるimplementation-dependentはかなり広く使われてるようだが特定の言語に限った話じゃないしね
- 166 名前:デフォルトの名無しさん mailto:sage [2008/05/07(水) 01:26:51 ]
- 一般の議論ではよく使われる「依存」だが、このスレでは非推奨の
用語ということにしたほうがよさそうだな。 このスレでは直訳した「実装定義」か、JIS用語の「処理系定義」、 「未規定」、「未定義」を使い分けるということで。
- 167 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 13:13:18 ]
- C++ が存在するのに新しい C 言語の仕様を策定するのは、C++ のコンパイラは
実装が難しいからですか?
- 168 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 13:32:46 ]
- C++はCの上位集合ではありませんが?
- 169 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:05:56 ]
- 上位集合ではないが、ほとんどの場合ソースを変更する必要がないか、
少し変えれば両方で動くようになる。 C99 のように C++ との互換性に問題を作ってまで新しい仕様を作る 必要はないんじゃないか?
- 170 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 15:49:33 ]
- C++なんかどうでもよくね
- 171 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 20:03:05 ]
- C99なんて誰も必要としていない
- 172 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:16:34 ]
- inlineとか変数宣言のブロック先頭縛り廃止とかのC++追随と
vsnprintfにlong longなど有名どころの独自拡張の追認だけにしておけば、 もう少し広まった気がする。
- 173 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:21:10 ]
- Bjarne 先生に相談しないで仕様を決めてしまったのかな。
- 174 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 00:14:23 ]
- スレ違い
- 175 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:22:23 ]
- 構造体の宣言と同時に初期化は有用
- 176 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 09:27:21 ]
- C++も0xで対応するんじゃなかったっけ
initializer_listとか
- 177 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 11:17:20 ]
- いちいち構造体のタグ名の前に struct を付けないといけないのは面倒くさい。
typedef しなくてもタグ名をそのまま型名として使えるようにしてほしい。
- 178 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 12:01:17 ]
- C++でもつかっとけ
- 179 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 13:19:14 ]
- コンストラクタはいらないがデストラクタが欲しい。
- 180 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 17:11:10 ]
- typedef すればいいから正直あまり困らないな >struct
- 181 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:03:42 ]
- 自分へのポインタを持つ構造体宣言するときにちょっと書くワードが多いくらいだろう
大した問題じゃない というか自分はC++でも typedef struct … しちゃうな、なんとなく気持ち悪くて
- 182 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:22:06 ]
- 自分へのポインタを持つ構造体も、事前に typedef しとけば・・・
って、その typedef を書く必要があるから結局は面倒なんだが。
- 183 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 03:02:46 ]
- Cでstruct tagを自動でtypedefしないのは、名前空間の問題にひっかかるからかな?
- 184 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 03:08:40 ]
- 特に理由はなかったんだろう。
何となく struct を付けた方がいいんじゃね? と思って仕様を作った。 でも、実際には面倒臭かったので C++ では必須ではなくなった。 それだけのことなんだろう。
- 185 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 03:24:45 ]
- 名前空間は、新規格で導入しない理由のひとつではあると思う。
構造体(共用体)タグが「通常の識別子」として扱われる改定がされた場合でも、 逆に従来の構造体タグ名前空間のままでtypedefされる改定となった場合でも、 もし過去にそうならないことに因って書かれたコードがあったらコンパイルできなくなる。 どちらでもない新しい名前空間を作るにしても、旧来のコンパイラを改良する手間は 名前空間の管理に手を入れる関係上、それなりの手間が必要になる。 そこまでして導入するほどの問題では絶対にない。と思う。気がする。
- 186 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 04:01:36 ]
- structってつけてくれた方が構文解析が楽だから、とかはさすがにないか。
- 187 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 11:01:15 ]
- 多分そうだと思う。
変数がブロックの先頭でしか宣言できないのも抽象構文木の構造に自然に合うからだと思う。 現在の C から派生した言語はほとんどこういう制限はない。
- 188 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 11:37:50 ]
- 昔はマシンが非力だったから
少しでも楽にしたかったのかもしれないね。
- 189 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:12:20 ]
- 配列の境界検査をしない、という仕様がまさにそれ
- 190 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:13:10 ]
- しないと言い切るとこのスレ的には間違ってるか
境界検査をしなくてもよい、だな
- 191 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:41:11 ]
- C++ の std::vector も境界チェックを行う at と行わない operator[] を用意してるから
非力だったからやらない、というわけではないと思われ。
- 192 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:44:49 ]
- 安全と効率を天秤に掛けて、効率を取る漢らしい言語なんです
- 193 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:46:03 ]
- []で境界チェックしないのはCとの互換性のためだろ
未定義動作に互換性もへったくれもない気がするけど
- 194 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:46:22 ]
- 可能な限り、安全は言語でサポートするものではなく
ライブラリでサポートするべき、って感じだな。 最大限の効率を約束する。
- 195 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:46:57 ]
- >>193
std::vector は C にないから 互換性なんてどうでもいいと思われるが。
- 196 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:10:54 ]
- VRAM直書きの時、境界検査されたらちょっとヤだな。
- 197 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 13:26:26 ]
- 論理エラーまでチェックしていたら OS なんて書ける性能はでないよ。
- 198 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 15:06:53 ]
- >>195
メモリ配置の連続性要求はCとの互換性のため
- 199 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 15:08:34 ]
- >>198
連続性要求と境界チェックは別の話だっしょ。
- 200 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 15:30:03 ]
- 境界チェックしてほしいなら /RTCs を付ければいいよ。VC 以外は知らない。
- 201 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:06:54 ]
- >>199
連続性要求と境界チェックは同じだとは言っていない。 「互換性なんてどうでもいい」なら連続性要求も必要ないはずだと言いたいだけ
- 202 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:12:50 ]
- 俺のカンでは話がかみあってないな
- 203 名前:>>136 mailto:sage [2008/05/18(日) 16:13:31 ]
- >>196
VRAM サイズの配列を宣言して、VRAM のアドレスにマップできるようにすればいいだけ。 >>197 いつの時代だよ。 爺は早めに引退しとけ。
- 204 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:14:08 ]
- >>201
普通の配列の話じゃなくて std::vector の話なんだけどな。 普通の配列に関しては互換性も理由の1つだろう(それだけじゃないとは思うが)。
- 205 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:14:46 ]
- >>203
そうやってどんどん OS を重くしてるから Vista みたいに叩かれるんだよ
- 206 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:33:09 ]
- >>204
配列じゃなくてstd::vectorに連続性要求があるんだけど
- 207 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:52:19 ]
- まぁ「レガシーAPIにstd::vector渡せますか?」
というのはC++のFAQだよな 次の規格ではstd::stringもそうなるんだっけ
- 208 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:57:42 ]
- std::string::c_str() があるのにそんな必要あるの?
- 209 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:07:54 ]
- 現在のc_strはコピーが発生する可能性があってパフォーマンスに響くかもしれない。
- 210 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:10:49 ]
- どう考えても>193がおかしい
Cにはvectorが存在しないのだから互換性が問題になるはずがない
- 211 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:12:25 ]
- Cで書かれたライブラリとのバイナリ互換性とか
- 212 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:50:29 ]
- >>206
だから連続性要求の話なんて誰もやってないんだってば・・・。 境界チェックの話だ。
- 213 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 17:53:11 ]
- そもそもだなぁ
なんで std::string::c_str() な話がこのスレで出てくる?
- 214 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:11:46 ]
- もし境界チェックを行う必要が無いという仕様が
大昔はマシンパワーが弱かったからという問題で作られたのなら C++ を作る時に std::vector で at でも operator[] でも境界チェックをすれば良かった。 でもそうしなかったということは、それだけの問題じゃないってことだろう。 という話。
- 215 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:16:35 ]
- だからCもC++も基本的に効率側に仕様を倒すんだよ
安全性はライブラリで頑張る方針
- 216 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:22:08 ]
- そういうこと。
昔マシンパワーが弱かったからじゃなくて、 マシンパワーに関わらず効率を取るってこった。
- 217 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:31:08 ]
- マシンパワーが高くなっても 10 分かかっている処理は速い言語で 5 分にしたいよ。
アプリにもよるけど。
- 218 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:32:57 ]
- >>215
> 効率側に仕様を倒す ちゃう, 特に C に関しては高級言語だと思ってはいけない freestanding な環境でも動作可能, つか, 標準ライブラリを使用せず (libgcc とかは微妙だけど)に動作可能なバイナリを吐き出せる事も 求められている. 実際 crt.o を自前で書けば, 標準ライブラリを使わずに実行イメージを 作ることが可能(しつこいけど libgcc とかは微妙) 境界チェックに関しては微妙だけど...
- 219 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:34:22 ]
- >>212
だから境界チェックしてない理由(の1つ)に連続性要求と同じ理由は考えられないのかと 言ってるだけなんだが。 std::vectorがCにないから互換性の問題がないなら operator[]で境界チェックをやることだって互換性の問題を起こさない
- 220 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 18:39:34 ]
- >>219
連続性要求は C++98 ではなく C++03 で導入された。
- 221 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:19:52 ]
- >>203
世の中Cで書いたプログラムのターゲットは3GHzクラスばかりじゃないんだよ。
- 222 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:37:35 ]
- >193は自分のレスをもう一回冷静に読み直せ
>191はvectorの境界チェックのみの話しかしていない だからそもそも互換性や連続性の話は関係ない お前が勝手にoperator[]全般の話を持ち出したから話がかみ合ってないだけだ
- 223 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:43:16 ]
- これは俺のカンだけど
>>193はoperator[]はあらゆるオブジェクトで同じもんだと思ってるね でなきゃ互換性なんてセリフ出るはずがない
- 224 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:48:39 ]
- >>219
vectorの連続性要求の理由はそのほうが直感的かつ便利だからであってCとの互換性からではない。 なぜならvectorはCに存在しないから。C++にしか存在しないものがCとC++の間での互換性で問題になる は ず が な い 。
- 225 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:50:43 ]
- >>224 だったらスレタイ読んで出直してこい
- 226 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 19:53:11 ]
- >>225
お前はレスの流れを読むべきだな
- 227 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 21:48:21 ]
- >>221
で、それがどうかしたのか? 非常にタイトな部分には、チェックをはずせるようにしとけばいいだけだろ。 しょぼい環境の奴は、頭もしょぼいのか? (w
- 228 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 21:52:24 ]
- 仕様と処理系の区別もつかないくらい耄碌してるのか。
- 229 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 23:26:28 ]
- 「ディフォルトは検査するが、指定した部分の検査をしなくてもいいように指示できる」
と言う言語仕様にすればいいだけ。 どこに処理系の話が出てくるんだ? # 耄碌爺って他人を耄碌してると思いたがるよな。(w
- 230 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 23:33:09 ]
- C言語の仕様は
「チェックなんて効率の悪い事はデフォルトではしない。検査は各々自己責任でやれ」 というスタンスなんだよ
- 231 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:14:36 ]
- 耄碌してんじゃなくて若くて無知なだけだったか。
- 232 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 00:21:52 ]
- >>230-231
はぁ? いまごろ何言ってんの? そんなこと >>192 に書いてある。 耄碌爺はちょっと前のレスすら覚えてないらしいな。 病院に行った方がいいぞ。
- 233 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 01:14:18 ]
- 話の整理
197 「Cぐらい男らしい言語じゃないとOSなんて組めないよねー」 ↑ 偏見というほどでもないがたぶん誇張 203 「そんなことはない、今のマシンのスペックなら(他の言語でも)十分いけるよ」 ↑ 正しいとは言い切れないが間違いではない 221 「そんな高スペックの環境ばかりじゃないんだよ」 ↑ ここがずれてる 203はそんな環境でCでない(チェックの厳しい)言語を使えとは言ってない 227 「低スペックな環境なら(その言語の機能で)チェック外すようにできればいいだろ」 ↑ まあ正論 230 「Cはそういう言語じゃないんだよ」 ↑ Cでない言語の話をCの話と勘違いしている というわけで話の理は203にある だが煽るのはやめろ
- 234 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 02:40:18 ]
- 自演乙、と言えばいいのか?
- 235 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 05:16:42 ]
- すっかり違う言語にかわっちゃうような機能を、オプションでつけはずし?
配列とポインタが交換可能なのはC言語の特徴ですよ。 ポインタが配列を指してるかどうかのチェックからするんですか?
- 236 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 05:47:52 ]
- ああ、そうか、>>203は最初からC言語の話なんかしてないのか。
>>233 解説ありがとう。 ということで、スレ違いだな。
- 237 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 12:44:06 ]
- C言語は最適化のヒントを与える機能を追加すれば後は拡張しなくていいよ。
C言語の役割はある程度ポータビリティーがあって可能な限り性能を出すこと。 どんなに CPU の性能が上がってもこの需要はなくならない。
- 238 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 15:40:22 ]
- できることが増えるスピードよりやりたいことが増えるほうが速いからな
- 239 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 22:33:30 ]
- >>235
相変わらず、頭固いネェ。 > 配列とポインタが交換可能なのはC言語の特徴ですよ。 未だに配列アクセスよりポインタアクセスの方が常に速いとか 思ってるんだろうな...。
- 240 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 06:08:38 ]
- 頭の固い人間 VS 論点がズレている人間
の対決はいつ見ても不毛
- 241 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 10:01:59 ]
- >>239
君の脳内言語の話はスレ違いだ。
- 242 名前:デフォルトの名無しさん [2008/05/20(火) 22:05:48 ]
- C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか?
- 243 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:23:18 ]
- >>242
それなんてコピペ? こんな感じでよろしいか?
- 244 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:27:14 ]
- おk
- 245 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 00:41:16 ]
- >>241
反論できなくなったら、脳内言語ときたか。 だったら、>>221 あたりでそう書きゃいいと思うが、 しょせん耄碌爺には無理か。(w
- 246 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 01:18:38 ]
- 煽るな
- 247 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 01:38:16 ]
- >>245
>>233 >>236
- 248 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 10:51:11 ]
- >>245
つまりこういう事だな。 「脳内言語だって気が付くのが遅せーんだyp」
- 249 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 23:45:16 ]
- 昔の知識で煽ったら、反撃くらって撃沈しただけだろ。
- 250 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 01:22:46 ]
- 俺言語の話なんかする奴が悪いな
- 251 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 04:36:43 ]
- 俺言語君の知識は、最近のCPUは速いって事だけだったからな。
反論する余地は無いな、たしかに。
- 252 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 07:42:58 ]
- お前らも煽るな
- 253 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 10:44:54 ]
- 大勢のフリした一人だろ。煽っているのは。
- 254 名前:デフォルトの名無しさん [2008/05/22(木) 11:51:11 ]
- おやそくの一言が出ました。
- 255 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 11:55:57 ]
- お夜食?
- 256 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:18:30 ]
- ↓ タイプミスをプギャーして勝ち誇るAAをどーぞ
- 257 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 12:19:49 ]
- m9(^д^)
- 258 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 17:41:00 ]
- ぐぐってもプギャーの意味分からなかった。
- 259 名前:デフォルトの名無しさん mailto:sage [2008/05/22(木) 22:44:05 ]
- > 俺言語君の知識は、最近のCPUは速いって事だけだったからな。
> 反論する余地は無いな、たしかに。 にもかかわらず反論してた爺は哀れだな。(w
- 260 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 05:38:05 ]
- いつまでも爺爺言ってる奴が根に持ちすぎてて怖い
将来犯罪起こしそうだな
- 261 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 07:38:27 ]
- 脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。
- 262 名前:デフォルトの名無しさん mailto:sage [2008/05/23(金) 23:57:40 ]
- >>261
> 脳内言語だと解ってからは、だれも反論なんかしちゃいないのにな。 >> 反論してた 爺は日本語も不自由らしい。(w
- 263 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:01:27 ]
- 俺言語の話してるのに、C言語の話だと思って反論してやんのプギャー
こうですね、よくわかります。
- 264 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 01:50:10 ]
- ひっかかった、くやしいムキー。
こうですね、よくわかります。
- 265 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 02:09:10 ]
- いつまでやってんの!
- 266 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 02:26:07 ]
- ケンカはやめて(><)
- 267 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 11:46:20 ]
- 爺で検索すればいいからわかりやすいな
- 268 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:49:54 ]
- C89 との違いのみを完全に全て列挙したような資料ってありますか?
- 269 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 17:51:43 ]
- C89 と C99 との違い・・・です。
- 270 名前:デフォルトの名無しさん mailto:sage [2008/05/24(土) 18:03:32 ]
- 完全かどうかは知らないけど
seclan.dll.jp/c99d/ とか
- 271 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:40:59 ]
- !0の値は1ですか?不定ですか?
- 272 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:42:57 ]
- 1です
- 273 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 17:49:09 ]
- ありがとう
- 274 名前:デフォルトの名無しさん mailto:sage [2008/05/26(月) 19:06:31 ]
- >>270
結構詳しいですが、完全なんですかね・・・。 何か漏れがあるとかいう話はないんでしょうか。
- 275 名前:デフォルトの名無しさん mailto:sage [2008/05/28(水) 22:52:00 ]
- 究極的にはC99の規格票買ってきて突き合わせるしかないだろ
- 276 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 12:30:47 ]
- >型名とグローバル変数の名前空間は独立
この仮定が間違ってる。
- 278 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 12:57:24 ]
- 型名も変数名も全て「一般の識別子」だよ
違うのは構造体タグだろ
- 279 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 15:10:44 ]
- 識別子と言うことと、名前空間の管理は全然別の話だよ。
- 280 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 16:14:06 ]
- Cの名前空間は4種類。
・ラベル ・タグ ・メンバ ・その他すべて(typedefした型名や一般の変数の名前を含む) つまり二つのfooは同じ名前空間を持つ。 これを同じスコープ(この場合ファイルスコープ)で使ったら当然衝突する。 スコープが異なるなら識別子の優先順位と隠蔽によってまったく問題なく処理できる。
- 281 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 17:07:45 ]
- C言語 名前空間 でググルとほとんどどんぴしゃの内容が...
uyota.asablo.jp/blog/2006/08/24/497407
- 282 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 17:11:45 ]
- >>281
まちがってるなぁ そこでa a;が許されるのはスコープが違うからであって名前空間が違うからじゃない
- 283 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 20:47:48 ]
- グローバルな型名はローカル変数名でシャドウされる?
- 284 名前:デフォルトの名無しさん mailto:sage [2008/06/01(日) 21:40:28 ]
- されるよ。
- 285 名前:284 mailto:sage [2008/06/01(日) 21:43:56 ]
- たとえば、
typedef int a; a main(){ a a; a b; // error return 0; }
- 286 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 05:48:23 ]
- 型を宣言するとき
defineではなくtypedefを使わないといけない明確な理由って なんですか? 今まで普通に使ってきたけど、新人にどう説明すればいいか 悩んでいます。
- 287 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:04:08 ]
- >>286
typedef char * pchar; pchar a, b; sizeof(b)=? #define pchar char * pchar a, b; sizeof(b)=?
- 288 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 06:38:47 ]
- >>286
あと、たとえば型size_tを要求する関数があったとして、 #define size_t int とかやると、size_tの変数を渡してもintで宣言した変数渡しても、コンパイラには区別がつかない。
- 289 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 07:12:47 ]
- >>286
typedef char *pchar; const pchar a; → a が const #define pchar char * const pchar a; → *a が const 主にポインタ関連で困ったことになる。
- 290 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:46:28 ]
- >>288
もともとCのtypedefは弱いtypedefだから区別ないけどね
- 291 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 13:48:33 ]
- >>286
関数ポインタ形とか配列型だと、構文の都合上で#defineではできないってのもあるね。
- 292 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 21:08:43 ]
- defineじゃデバッグ時にこまるじゃん
- 293 名前:デフォルトの名無しさん mailto:sage [2008/06/02(月) 23:22:48 ]
- typedefにはスコープがある。
defineには無い。
- 294 名前:デフォルトの名無しさん mailto:sage [2008/06/03(火) 21:24:03 ]
- typedefにはスープがある。
defineには無い。
- 295 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 01:19:44 ]
- define には名前空間がない。
- 296 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 07:28:02 ]
- typedefにも名前空間はない
- 297 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 07:44:55 ]
- 我輩には名前がない。
- 298 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 10:16:06 ]
- うちの女房にゃひげがある
- 299 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 17:02:02 ]
- さぁみんな、微妙に勘違いする仕事に戻るんだ!
- 300 名前:デフォルトの名無しさん mailto:sage [2008/06/04(水) 21:50:30 ]
- C言語をはじめたばかりであまりわからないのですが、
ビットシフトはなんの役に立つのでしょうか? こうですね、わかります
- 301 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:00:00 ]
- この中では memset(&p, 0, sizeof p); が最も確実。
上の2つはもしかしたら上手くいかないかもしれない。 3つ目は明らかに間違い。
- 303 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:21:41 ]
- いや、3つ目もいいんじゃないか?
- 304 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 22:27:52 ]
- 一番下以外は未定義動作
- 305 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:23:38 ]
- こういうのは?
p = (void*)(int)0;
- 306 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:27:42 ]
- 整数をポインタにキャストした場合の動作は定義されない。
- 307 名前:デフォルトの名無しさん mailto:sage [2008/06/05(木) 23:58:57 ]
- >>306 んなこたーない。
- 308 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:40:19 ]
- ポインタ型は、(何らかの)整数型と情報を失わずに相互変換できる。
- 309 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 00:41:02 ]
- 別に0というリテラルがヌルポインタとして使えると定義されてるわけじゃないぞ。
コンパイル時に0になると決定できる定数式は全部ヌルポインタとして使える。 だから p = (void*)(1-1); p = (void*)!1; はヌルポインタ。
- 310 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:28:03 ]
- >>309
だから、NULLポインタは全ビット0とは限らない、って話だろうが
- 311 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 11:38:15 ]
- だから上二つは上手くいく保証がないってことだろ
- 312 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 20:05:28 ]
- 上3つでねーの
- 313 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:02:13 ]
- memset() の第2引数が定数の0だと本当にビットパターンが0になるの?
bzero() がもともとそういう仕様だから確実じゃない?
- 314 名前:デフォルトの名無しさん mailto:sage [2008/06/06(金) 22:09:41 ]
- >>313
もちろん。関数の引数は常に値渡しだ。 ということは memset() が受け取った値0は必ず変数に代入されて処理される。 変数0がヌルポインタに変換されることは絶対にない。
- 315 名前:デフォルトの名無しさん mailto:sage [2008/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 名前:デフォルトの名無しさん 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
ありがとうございます スッキリしました これでゆっくり眠れます
|

|