[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 05/09 17:48 / Filesize : 178 KB / Number-of Response : 821
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者お断り】ガチ規格準拠C専用スレ Part133



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/

【このスレ住人としての心得】
わざとスレ違いあるいはごく低レベルな質問を繰り返して
流れを妨害する荒らしがいます。適当に誘導して放置してください。

449 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:56:29 ]
そもそも何で呼び出し規約が関係するんだよ・・・。
最悪スタートアップルーチンを main によって変えれば済むだけの話じゃん。

450 名前:429 mailto:sage [2008/11/20(木) 21:57:52 ]
>>446
私は、元の引用文を
If 
1) the function is defined with a type that includes a prototype, and
2) either 2.a) the prototype ends with an ellipsis (, ...) 
   or 
          2.b) the types of the arguments after promotion 
               are not compatible with the types of the parameters, 
the behavior is undefined.
と考えましたが間違っているのでしょうか?
差し支えなければ、あなたの解釈を教えてください。

451 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 21:59:48 ]
>>449
だからそれはすでに述べられ済み。
pc11.2ch.net/test/read.cgi/tech/1225320579/951

452 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:06:24 ]
>>449
呼び出し規約、具体的には stdcall と cdecl とではスタックを払うのが呼び出し側か呼び出され側にあるか、という違いがあります。
すなわち、呼び出し側で仮定した引数と呼び出され側で仮定した引数とが異なってもよいか、それとも完全に一致しなければならないか、という違いを意味します。
スタートアップコードが main() を呼ぶときにスタックに積む引数と、main() がスタックに積んであると仮定している引数とが一致しなくてもいいのか、それとも一致しなければならないか、ということです。
stdcall では main() がスタックを払うので、両者は一致しなければなりません。

453 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:08:01 ]
>>448
その論法でいけば、引数がないときには
int main()
とすれば、もっと楽ではないでしょうか。

454 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:25:32 ]
どうでもいいけどおまえら2chのレスをソースにするなよwww

455 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:32:51 ]
一体何を問題に従ってるのかさっぱりわからん

456 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:33:42 ]
読んでて混乱するから以前の自分の発言を話の前提にしたいならレス番を名前に入れろ

457 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:36:53 ]
>>451
何度dat落ちしたスレのアドレスを張る気だ



458 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 22:47:16 ]
頑張って読んだ

要するにお前の主張は
「int main(void)って書くの気持ち悪い!気持ち悪いよねお前らもそう思うだろ!!」
だな?

じゃあそれに対する答えは
「規格が許してるんだから書きたいやつが書いて何も問題ねえしお前の好みなんか知るかボケ」
だよ

459 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:00:06 ]
呼び出し規約とか関係ねぇから

460 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:02:42 ]
>>452
main を見てスタートアップコードを作るんだろ・・・。
何で先にスタートアップコードがあるんだよ。
バカかよ。

461 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:03:55 ]
voidって空って意味だから、int main(void)って書いて
引数リストが空だってことを明示している方がわかりやすい。
int main()だと、引数リストがvoidなのかdon't careなのか不明確。

int main(void)が気持ち悪いってやつは英語のセンスがないんだろうね

462 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:05:03 ]
>>453
規格上はそれで問題ない。
関数定義での () は (void) と規格上は等価だから
(関数原型ではもちろん () と (void) は別だが)。
でも、その規格に準拠していないコンパイラがあるから
已む無く (void) をつけているに過ぎない。

463 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:10:15 ]
>>457
dat落ちしてるなら内容も貼って欲しいよね。

pc11.2ch.net/test/read.cgi/tech/1225320579/951
951 名前:デフォルトの名無しさん[sage] 投稿日:2008/11/16(日) 21:46:28
>>949
個人的には、int main(void); という書き方に不満があります。私なら int main(); とします。でも、cdecl でも stdcall でも通用するようにしたいのでしょうけれども。

464 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:11:25 ]
では採決します。

int main(void)が気持ち悪いと思う人いますか?

465 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:12:16 ]
気持ち悪くないが C++ やってると面倒くさいとは思う。

466 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:12:49 ]
>>456
発言したが私であることを特に問題にはしていないのですけれども。

467 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:13:20 ]
>>457
それはあなたの事情であって私の知ったことではありません。



468 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:15:45 ]
>>466
単発のレス読んでると何が言いたいかワカンネってんだよ

469 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:17:42 ]
>>458
main() に与えられる引数を使用しない場合に int main(void) と特に規定したのはどういう理由だろうか?
という点です。その理由が基本的によくわからない(ある程度の推測はあるにしても)し、普通の関数ではそんなふうには書かないので、
これは問題ではないか、ということを問題にしています。

規格そのものを問題にしている以上、「規格が許しているんだから」は答えにならないのは自明なのですが。

470 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:17:53 ]
>>468
あなたの理解力不足を人のせいにするのはやめてくれませんか?

471 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:19:14 ]
>>469
普通の関数でも void 書くだろ・・・。

472 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:19:46 ]
>>469
ダウト。
普通の関数でも引数リストでhoge(void)って使います。


473 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:20:14 ]
>>460
いいえ、スタートアップコードがあって、main() がそれにリンクするのです。
スタートアップコードを使い分けるにしても、それは同じこと。
大体スタートアップコードを使い分けているコンパイラがありますか?
そんな処理系は printf() をはじめとする可変長引数の関数が一切使えないのではないかと。

474 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:20:19 ]
>>469
          ,、‐ ''"  ̄ ``'' ‐- 、
        /イハ/レ:::/V\∧ド\
       /::^'´::::::::::::i、::::::::::::::::::::::::::::\
     ‐'7::::::::::::::::::::::::ハ:ハ::|ヽ:::;、::::::::::::丶
     /::::::::::::::/!i::/|/  ! ヾ リハ:|;!、:::::::l
    /´7::::::::::〃|!/_,,、   ,、==、、''`‐ly:::ト
      /|;ィ:::::N,、‐'゛_,,.\   !"r‐、ヽ  !;K
        ! |ハト〈  ,r''"゛  ,   ヽ゚,シ リイ)|
          `y't     ヽ'    ,,ィァ  //  
         ! ぃ、  ト─=ニニ‐ノ 〃
         `'' へ``'ー─‐‐'´,  .イ
              `i;、     / l
                〉 ` ‐ ´   l`ヽ
            / !        レ' ヽ_
         _,、‐7   i|      i´   l `' ‐ 、_
     ,、-‐''"´  ノ,、-、 / 、,_ ,.、- {,ヘ   '、_    `ヽ、_
   / i    ,、イ ∨ l.j__,,、..-‐::-:;」,ハ、 '、` ‐、_   ,`ヽ
  /  l ,、‐'´ // ',/!:::::::::;、--ァ' /  `` ‐   `'7゛   ',

475 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:21:26 ]
int foo(void)なんて喜んで書く人は、悪いけどプログラミングのセンスを疑いますよ
バカにしてるとさえ感じますね
コンパイラや保守者や、Cという言語に対しても

476 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:22:12 ]
>>472
あなたとは仕事をしたくない

477 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:22:26 ]
void 書かないと引数書き放題だろ・・・。
バカか、こいつ。



478 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:24:44 ]
>>461
引数を指定するのに呼び出し側を考慮しないのはどうかと思います。
それに、スタートアップで引数をスタックに積んでいる以上、main() の場合は do not care のほうが適当かと。

>英語のセンスが
英語のセンスなど別にどうでもいいです。

479 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:25:17 ]
>>463
恐縮です。

480 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:25:48 ]
>>475
アマチュアの方ですか?
CはC++みたく引数までシグネチャーに含んでくれないので、
型チェックはコンパイル頼みになるのです。
引数なしの関数をチェックさせるために(void)って書くんですよ。

まぁあなたみたいに一人でオナニープログラム書いている人には
関係ないでしょうが。

481 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:26:38 ]
>>473
使い分ける必要のある環境なら
main のあるソースをコンパイルする時に
自動的にそれに対応したスタートアップを追加するか、
あるいはリンカが main によってリンクするスタートアップコードを変えるか、
そういう実装になるはずだろう。

482 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:27:20 ]
>>471
「普通の関数でも 引数指定部分のvoid は好まない」とは一言ももうしあげておりません。

483 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:27:37 ]
>>478
まず、int main() { } の () は don't care ではなく void だ。規格上は。

484 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:27:46 ]
>>478
>それに、スタートアップで引数をスタックに積んでいる以上、
>main() の場合は do not care のほうが適当かと。
ダウト。
引数をスタックに積むとは限らない。
処理系依存。

485 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:28:58 ]
>>472
言葉が足りませんでしたね。
呼び出し側で引数を指定しているのに、コール先で引数なしとすることはないと思います。
これが呼び出し側:スタートアップ、コール先:main() であっても同じなのではないでしょうか?

486 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:29:22 ]
>>485
ダウト。
常に呼び出し側で引数を指定しているとは限らない。

487 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:31:19 ]
>>484
ん、広く範囲をとれば、それはそういうことになるとは思います。確かに引数をスタックに積むとはかぎりらないでしょうね。



488 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:31:22 ]
型チェックってのは1つ以上の引数を渡した時に、間違った型として扱わないために必要なのであって
もともと引数取らない関数にとってはどうでもいいことです
だいたい引数取らない関数に引数なんか渡したら誰だって間違いと気付きます

ちなみにC++が引数なし関数までシグネチャに含むのはデフォルト引数があるからです

489 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:32:18 ]
>>483
詳説を希望いたします。

490 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:32:50 ]
>>485
>呼び出し側で引数を指定しているのに、
>コール先で引数なしとすることはないと思います。
ダウト。
それはあなたの思い込み。
言語仕様上そういうことが可能ならば、間違いは必ずおきます。
プロならばそれを回避しようとするのは当然。

491 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:32:53 ]
>>488
コンパイラは間違いに気づきません。
コンパイラが気づかなかった事により、人間も気づかないかもしれません。
例えば引数の数を変えた時とか。
そもそも引数の数によって引数チェックが必要か必要ないかが変わることこそ気持ち悪い。

492 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:33:47 ]
>>489
>>462

何度も同じ事を言わせるな。

493 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:33:56 ]
引数をスタックに積まない実装など見たことがありません
今までに存在したとも思えないし、これから登場することも考えられません
(ネタやお遊びで作った実用性のない環境は知りませんよ)

規格の無意味な汎用性への配慮の産物がint main(void)という醜悪な構文なのです

494 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:34:04 ]
>>488
>だいたい引数取らない関数に引数なんか渡したら誰だって間違いと気付きます
んー、コンパイル単位を別にとれば、問題なくコンパイル/リンク可能で、かつ、大概の環境では問題もないのですが。

495 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:35:04 ]
>>488
>ちなみにC++が引数なし関数までシグネチャに
>含むのはデフォルト引数があるからです
ダウト。
C++にはオーバーロードがあるからです。
知ったかすんな

496 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:35:23 ]
>>492
これは申し訳ない。調べておきます。

497 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:36:16 ]
>>493
ヒント:ニンテンドーDS



498 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:36:57 ]
>>493
レジスタ渡しとかも普通にするだろ。

499 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:37:06 ]
>>491
そもそも間違って渡したから何だというのでしょう
引数に名前は付いてないので関数からは手出しできません
だから何かを壊すことはありません
せいぜい値渡しの無駄なコピーが何回か増えるだけです
型チェックのコストの方が高いという判断はありうることです

500 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:37:54 ]
なんだか釣りにしか見えなくなってきたな

501 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:38:05 ]
>>499
やっぱ引数欲しいや、って増やす事だってあるだろ。
その時に変な引数渡されるかもしれない。

502 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:38:59 ]
>>489
483じゃないが。

X3010:2003の6.7.5.3の中ほど。
> 並びの中の唯一の項目がvoid型で名前の無い仮引数であるという特別な場合、関数が仮引数を持たないことを指定する。
(中略)
> 関数定義の一部である関数宣言子で識別子並びが空の場合、関数が仮引数を持たないことを指定する。
> 関数定義の一部で無い関数宣言子の識別子並びが空の場合、仮引数の個数および型の情報がないことを指定する。

でもこれって、C99なんだよね。C89とか規格書持っていないから俺は分からない。

503 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:39:40 ]
>>495
オーバーロードはデフォルト引数が導入されてからずっと後にC++に取り込まれました
オーバーロードも理由の一つではありますが、そもそもはデフォルト引数です
そちらこそ知ったかはおやめ下さい

504 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:40:15 ]
>>499
>そもそも間違って渡したから何だというのでしょう
間違って"渡さない"場合もあるだろ。
そしたらクラッシュするよ。

>型チェックのコストの方が高いという判断はありうることです
型チェックのコスト?
コンパイル時だからコストなんてかかんないよ

505 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:40:37 ]
>>481
純粋な意味でのリンカがオブジェクトファイルを個別にチェックするのはちょっと考えられませんが。
昔の処理系では、生成したオブジェクトのほかスタートアップを陽にリンクするような方法も紹介されていました。(bccとか)

506 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:41:02 ]
>>499
引数の数が間違っているとリターンがうまくいかないstdcallやpascalのことも忘れないでください。

507 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:42:17 ]
>>505
なら前者を採用すればいい話だ。



508 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:43:10 ]
>>504
引数をとらない関数に引数を間違って渡すとはどういう事でしょうか
意味がわかりません

引数を1個とる関数は当然に型チェックが必要ですよ
その1個の引数に間違った型でアクセスしたら大変なことになりますからね
でも引数をとらない関数は、そもそも引数自体にアクセスが出来ないのです
アクセスできない所に何が積まれようと知ったことではないのです

509 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:44:01 ]
間違えました

>>504
引数をとらない関数に引数を間違って"渡さない"とはどういう事でしょうか
意味がわかりません

510 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:45:14 ]
>>502
感謝です。
では、特に int main(void) という規約は必要ないことになるのですが、なぜわざわざ int main(void) という書き方を規約としたのでしょうか?
int main(void) を陽に指定する必要はないと思われるのですが。

511 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:45:56 ]
>>505
int main(void)とint main(int argc, char **argv)でなくて恐縮だが、
VC++などでは、main/wmain/WinMain/wWinMainのどれが定義されているかによって、
リンクするスタートアップルーチンが変わるようになっている。

512 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:46:15 ]
>>510
int main(void) と等価な書き方も許されるから
int main() も規格合致。

513 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:46:38 ]
>>508
ばかだなぁ。
int hoge();
は、引数をとらないんじゃなくて、
どんな引数を渡してもいいって意味なんだよ。
わかる?

514 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:47:46 ]
>>513
それも意味的には違うな。
引数に関して何も関知しないってことだな。
() は (...) とは意味が違う。

515 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:48:16 ]
>>507
まあそれはそうですが、すでにその話は私のみならず他の方からも指摘されていたりするのです。>>422

516 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:49:33 ]
>>515
>>422>>481 と同じ主張だ。

517 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:50:28 ]
>>503
>オーバーロードはデフォルト引数が導入されてからずっと後にC++に取り込まれました
>オーバーロードも理由の一つではありますが、そもそもはデフォルト引数です
>そちらこそ知ったかはおやめ下さい
ダウト。
多重定義導入時にマングリングが導入された。



518 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:50:47 ]
>>511
それは、リンカを制御する上位構造があるから、ではありますね。そのへんは理解しているつもりです。

519 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:51:18 ]
なんでアホの好みの問題に振り回されてんの?

520 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:52:07 ]
>>519
暇だからw

521 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:52:41 ]
>>519
何か話題pls.

522 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:53:28 ]
>>518
>リンカを制御する上位構造があるから


523 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:54:52 ]
リンカオプションのことか

524 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:55:03 ]
ん、やっと自らの過ちに気づいたかな?
今頃顔真っ赤かな?

525 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:55:39 ]
そろそろISOにint main(void)の抹殺を嘆願する署名を集めてもよろしいでしょうか?

526 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:56:15 ]
どうやらヤツは壮絶に勘違いしてたようだね
>>508のレスが証拠だね


527 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:57:43 ]
>>525
お断りします
   ハハ
   (゚ω゚)
  /  \
((⊂ )  ノ\つ))
   (_⌒ヽ
   丶 ヘ |
εニ三 ノノ J




528 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:57:44 ]
>>525
どうぞどうぞ

529 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:58:13 ]
>>523
昔はコンパイラとリンカは別だったのですが。
その辺のニュアンスを含めて、「純粋なリンカ」と書きましたが、昔話ですみません。

530 名前:デフォルトの名無しさん mailto:sage [2008/11/20(木) 23:58:55 ]
今も別だろ・・・。

531 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:00:12 ]
>>530
それは知りませんでした。多謝。

532 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:00:29 ]
>>510
確かにint main()と書いても規格の意味するところは何も変わらない。

533 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:00:30 ]
もうだめだ

534 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:01:40 ]
実質的に一緒でしょう
今時本当にコンパイルしかしないコンパイラなんてごく稀ですよ
明示的にリンクを抑止するオプションでも指定しない限り

535 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:01:56 ]
>>532
意味する所は変わらんが、
意味を正確に知るには別の箇所(6.7.5.3)も読まないといけないのが面倒だな。

536 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:02:28 ]
>>534
それはコンパイラがリンカを呼んでるんだよ・・・。

537 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:02:37 ]
やっとみなさんのおっしゃることがわかりました。
文法の誤解というか、勉強不足のところがありました。
お騒がせして申し訳ありませんでした。



538 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:04:07 ]
>>534
コンパイラ単品ではあまりないかもしれないけど、
リンカ単品売りはあるよ。

539 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:06:07 ]
>>518
VC++の場合、コンパイラを介さずともリンカにmainとかWinMainとかを持ったobjを食わすだけで判別する。

540 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:07:18 ]
関数宣言で仮引数リストが空の場合と関数定義で空の場合で大違いなので
どっちの方を指してるのかちゃんと書き分けておくれ

541 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:08:13 ]
>>540
お断りします
   ハハ
   (゚ω゚)
  /  \
((⊂ )  ノ\つ))
   (_⌒ヽ
   丶 ヘ |
εニ三 ノノ J

542 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:08:18 ]
main は関数原型を書かないから
関数定義に決まってる

543 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:08:44 ]
そういやC言語ってC++0xみたいなのって進んでるの?

544 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:10:59 ]
C99 の先は一応議論されてはいるみたいだが、
あまり熱心ではなさそうだ。
C99 でもう C としては十分だろうし・・・。
これ以上追加していくと C++ になりそうだ。

545 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:12:43 ]
C99でさえなかったことにされてるのにその先なんて…

546 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:13:22 ]
>>542
書いたらダメなの?

547 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:15:05 ]
>>542
そうとは限らんよ
binary.nahi.to/b2con2006_sato.pdf

まぁ相当変態なケースだけどなw



548 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:16:28 ]
restrict とか [const] とかはやり過ぎだとは思うが
局所変数宣言位置自由とか inline とか
main での return 省略とかは地味に良いんだがなあ・・・。

549 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:18:17 ]
C99なんかCじゃない
sizeofがコンパイル時に確定しないような変態言語がCを名乗るな

550 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:18:51 ]
gcc拡張が標準化されればいいや

551 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:19:27 ]
>>549
kwsk

552 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:21:39 ]
void f(int n)
{

}

553 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:22:06 ]
int a[n]; の時の sizeof a が実行時に決まるってだけだ

554 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:22:13 ]
おっと途中送信
void f(int n)
{
  char c[n];

}

555 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:22:51 ]
この2chブラウザあかんわ

556 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:23:22 ]
>>543
こういう感じらしい。
ttp://www.hi-matic.org/diary/?20081117#17-4

557 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:24:12 ]
>>547
おもしれーなw



558 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:25:12 ]
>>553
thx!
むしろint a[n]; ができる方がすげー

559 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 00:26:42 ]
alloca みたいなもんだな。
スタック上に確保されるだろうから
大きな値を使われるとオーバーフローするかもな。

560 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 10:58:31 ]
馬鹿ばっか

561 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 11:01:31 ]
longjmpで抜けた場合には解放される保証がないということから、処理系によってはヒープ上かも

562 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 17:56:36 ]
mainを呼ぶWinMainを書いたことがある俺

563 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 18:59:13 ]
main = 0x909090C9;

564 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 23:42:04 ]
>>561
> longjmpで抜けた場合には解放される保証がない
ここを詳しく


565 名前:デフォルトの名無しさん mailto:sage [2008/11/21(金) 23:49:03 ]
longjmpで抜ければ、普通スタックは巻き戻される。
つまりスタックにallocateしているなら、解放される。

mallocしたメモリと同じようにヒープに確保して、
暗黙のうちに関数のエピローグでfreeしているとすると
longjmpで抜けてしまうと関数のエピローグを通らないから
freeされない。つまり、解放される保証がない。

566 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:18:34 ]
保証が無いってのが微妙な表現だな。
スタック使っても、ヒープ使っても、
サイズによってどっち使うか決めても規格合致ってことか。

567 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:33:57 ]
>>564
longjmpのところに↓のようなことが書かれてる

EXAMPLE The longjmp function that returns control back to the point of the setjmp invocation
might cause memory associated with a variable length array object to be squandered.
#include <setjmp.h>
jmp_buf buf;
void g(int n);
void h(int n);
int n = 6;
void f(void)
{
int x[n]; // OK, f is not terminated.
setjmp(buf);
g(n);
}
void g(int n)
{
int a[n]; // a may remain allocated.
h(n);
}
void h(int n)
{
int b[n]; // b may remain allocated.
longjmp(buf,2); // might cause memory loss.
}



568 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 00:38:09 ]
なるほど。may に might か。
開放される実装になってても規格違反ってわけじゃないのね。

569 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 06:35:20 ]
関係ないけど、そのsetjmpの使い方、未定義ですな

570 名前:デフォルトの名無しさん mailto:sage [2008/11/22(土) 11:40:43 ]
知らんがな(´・ω・`)

571 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 09:05:10 ]
setjmpは条件式の中からしか呼べないんだっけ?

572 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:03:50 ]
なんだ? そのわけわかめな制限は。

573 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:35:20 ]
setjmp の使い方を考えれば至極妥当だと思うが・・・。
無限ループになるぜ。

574 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:38:23 ]
無限ループになるかどうかも未定義か

575 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:40:44 ]
An invocation of the setjmp macro shall appear only in one of the following contexts:
- the entire controlling expression of a selection or iteration statement;
- one operand of a relational or equality operator with the other operand an integer
constant expression, with the resulting expression being the entire controlling
expression of a selection or iteration statement;
- the operand of a unary ! operator with the resulting expression being the entire
controlling expression of a selection or iteration statement; or
- the entire expression of an expression statement (possibly cast to void).
If the invocation appears in any other context, the behavior is undefined.

・・・だそうだ

576 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:43:11 ]
環境限界 setjmp マクロの呼出しは,次に示すいずれかの文脈にしか現れてはならない。

・選択文又は繰返し文の制御式全体
・他方のオペランドが整数定数式である関係演算子又は等価演算子の一方のオペランド。
 この場合,関係演算子又は等価演算子による式は,選択文又は繰返し文の制御式全体でなければならない。
・単項 ! 演算子のオペランド。この場合,単項 ! 演算子による式は,選択文又は繰返し文の制御式全体でなければならない。
・式文の式全体(void にキャストされていてもよい。)。
 setjmp マクロの呼出しがこれ以外の文脈に現れた場合,その動作は,未定義とする。

要するに、
・「if(A)」「switch(A)」「while(A)」「for(X;A;Y)」のどれかのAの場所に、
「setjmp(buf)」「setjmp(buf) op Z」「Z op setjmp(buf)」「!setjmp(buf)」(opは> < >= <= == !=のどれか)
のいずれかの形で出てくるか
・単に「setjmp(buf);」「(void)setjmp(buf);」の形で出てくるか

どっちかでないと鼻から悪魔

577 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 13:45:52 ]
なら別にそのまま使ってもいいのか。



578 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:04:21 ]
制御文の中で直接真偽判定する以外にその値を使ってはいけないってことかな

579 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 14:10:20 ]
longjumpから帰ってきたかどうかを示す値が揮発性だってこと?

580 名前:デフォルトの名無しさん mailto:sage [2008/11/23(日) 22:36:28 ]
sequence point間に単独で置いとけってことだろう。

581 名前:372 mailto:sage [2008/11/24(月) 09:28:32 ]
関連の規約をチェックしました。>>537 は実は別人ですが、同じ気持ちです。感謝です。
>>502, >>535 ポインタを紹介していただきありがとうございました。非常に勉強になりました。
なお、>>508 は私ではありません。

582 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 15:09:46 ]
久しぶりに覗いてみたら、かつてのfj.lang.cなみのマジキチぶりにワロタ

583 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 15:36:09 ]
>>582
それは賛辞に取られかれない危険な発言かと。

584 名前:デフォルトの名無しさん mailto:sage [2008/11/24(月) 23:39:27 ]
fj.lang.cってどこのサイトですか?

585 名前:デフォルトの名無しさん [2008/11/25(火) 00:05:57 ]
>>584
ja.wikipedia.org/wiki/Fj_(%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E3%82%B0%E3%83%AB%E3%83%BC%E3%83%97)

586 名前:デフォルトの名無しさん mailto:sage [2008/11/25(火) 00:16:53 ]
>>585
トン。
理解力ないんでよくわかんなかったw
スレタイよくみたら初心者お断りなので帰ります。。。λ

587 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 13:57:38 ]
>>584
マジレスするとネットニュース。
Webからアクセスできるゲートウェイも存在するが、
「どこのサイト?」とか言っちゃうあたり時代はかわったんだなぁと思った。



588 名前:デフォルトの名無しさん mailto:sage [2008/11/27(木) 14:11:53 ]
俺は>>584ネタかと思ったよ

589 名前:デフォルトの名無しさん [2008/12/10(水) 00:27:10 ]
俺はパソコン通信からやってるけど
本格的にインターネットを使いだしたのが
遅かったので知らない。

590 名前:デフォルトの名無しさん [2008/12/10(水) 09:27:58 ]


■■■■■■

591 名前:デフォルトの名無しさん [2008/12/10(水) 09:35:00 ]
■■■■■■■■■■■

592 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 11:55:31 ]
>>589
まだナツメネットとかアスキーNETとかw

593 名前:デフォルトの名無しさん [2008/12/10(水) 13:41:40 ]
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
2ちゃんねるという馬鹿な掲示板を削除してくでさい
ドコモ規制するとか頭おかしいんじゃねーの?

のんたん
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■
■■■■■■■■■

594 名前:デフォルトの名無しさん [2008/12/10(水) 13:47:50 ]
      __     ,.-、
.      l _ヽ     .l ri.ヽ
     l l ヽヽ.  // l. !
     l l,.- '  ̄  ̄ ! .,
.      l  rn  ,.、 n ,.イ,.-   _
    二l- `'' ヽニノ- _,フー‐  r ,.-- '
.    -‐`ーr'´ 〉 ´  、 `ヽ ,! l
         ヽ-r'     ヽ' ノ /
         ヽ、      .l' ´
          /´  /   !
         ⊂._,.!   _/
              ̄

595 名前:デフォルトの名無しさん mailto:sage [2008/12/10(水) 17:42:48 ]
ご冥福をお祈りします

596 名前:デフォルトの名無しさん [2008/12/22(月) 01:21:46 ]
あげ

597 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:10:13 ]
a.cでint iというグローバル変数を定義して
b.cでint iという同名のグローバル変数を定義しても
多重定義にならないのは何故ですか?



598 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:19:07 ]
>>597
>>133-

599 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:21:53 ]
>>598
ありがとうございます。

600 名前:デフォルトの名無しさん [2008/12/26(金) 19:39:16 ]
d.hatena.ne.jp/ku-ma-me/20081017/p1
これってどうなの?

601 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 22:47:14 ]
>>600
似たような話で、規格にはプログラムのサイズについて規定は無いが、実際には有限だ。

関数定義が CPU インストラクションの列で実装されていれば、対象環境の
プログラム配置領域サイズによって制限を受ける。

同じように、自動記憶域がスタックで実装されていれば、対象環境でのスタックの
サイズに応じてプログラムが制限を受ける。

そういうことだと思う。つまりは、言語の規格は上記のような制限の無い仮想マシンに
ついての動作を規定するもので、実装方法や実際の動作環境によって生じる制限には
関知しない、と。

602 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:01:54 ]
現実のコンピュータでCの規格に完全準拠することは理論上不可能
ってことでいいのか。ありがとう、すっきりした。

603 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:06:30 ]
理論上はそうなってしまうので、規格には最低限満たして欲しい基準が補足で書かれてる

604 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:10:00 ]
>>603
どこ?

605 名前:デフォルトの名無しさん [2008/12/27(土) 00:10:28 ]
処理系限界が下限に限らず存在することが規定されている

606 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:15:38 ]
>>602
ブログの人はそういってるけど 601 は違うといってるんだが。

607 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:19:16 ]
>>606
じゃあ理論上可能なの?



608 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:19:38 ]
Cでは基本的に「ハードウェアのやることはなんでもあり」であって、
規格はハードウェアに発する命令の体系を既定しているに過ぎない。
ハードウェアの能力が足りなくて要求を実現できないのと、
実装が規格に準拠しているかどうかはまったく別の問題。

609 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:24:06 ]
>>607
601 を読んだうえで、不可能だと思う理由を述べてください。

610 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:24:12 ]
>>604
AnnexB

611 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 00:41:21 ]
>>608
メモリ無限の仮想マシンの上で動くバイナリを出力するコンパイラなら
理論上は作れる。実行はできないが。
ってこと? そういうことなら納得。

>>610
Annex BはLibrary summaryになってる。
手元にC99のCommittee Draftしかないんだけど。

612 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 02:34:54 ]
>>611
いや、言語として規定はないから作れる。実行も出来る。
ただ実行した時の結果・挙動についてまでは保証しませんよってこと。

C言語としてはこの場合、「無限再帰呼び出しを行うマシンコードが生成される」
ところまでしか保証しない(コンパイラによっては警告出すかもしらんが)。
それを実行した結果、何が起こるかかまでは規定できないし、しない。

int *p = 0; *p = 100;
このコードがコンパイル出来ますか?実行出来ますか?
って問題と同じだろう。コンパイルも実行も可能だが、結果は環境に依存する。

613 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 14:44:56 ]
末尾再帰だからループに直すのだ!

614 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 16:52:07 ]
>>612
> int *p = 0; *p = 100;
これは未定義だってはっきりしてるじゃん。別の話。

615 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:26:24 ]
int *p = 0; *p = (int*)100;じゃないとコンパイル通らなくないか?

616 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:31:13 ]
>>615 試してから書けよ。

617 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:34:15 ]
ごめんポインタ2つ宣言してるように見えてた



618 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 19:41:07 ]
>>611
その理解であってると思う。極端な話、現実のCPUやOSは物理的に故障する可能性が
あるのに、その上でC言語の仕様に完全に準拠するなんて不可能だ。

>>612
コンパイラの仕事は、入力したソースコードの意味と同じ意味を持つ実行ファイルを
出力すること。実行ファイルの意味はCPUやOSの仕様が規定している。CPUやOSが自身の
仕様通りに動くときは「実行した時の結果・挙動」を保証しないと、「C言語の仕様に
準拠したコンパイラ」とは言えない。

ってか、C言語の仕様は実現方法を規定しないから、「無限再帰呼び出しを行うマシン
コードが生成される」ことも保証されないぞ。

619 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 21:40:47 ]
setbuf, setvbuf 関数で自らバッファをmallocして設定したとき、fcloseしたらそのバッファもfreeされるのでしょうか?
もしくはそのバッファは(gccでは)どういう運命をたどるのでしょうか。

620 名前:デフォルトの名無しさん mailto:sage [2009/01/20(火) 21:57:51 ]
RTFM


621 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 00:05:37 ]
>>619
glibcだとユーザーが定義したバッファは開放されないみたい。

622 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 01:00:00 ]
>>621
ありがとうございます。
linux manをみても、NULLの場合は開放とあるのですがユーザ設定のときは言及もなく未定義とも書いてなかったので。


623 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 04:44:41 ]
ユーザがセットしたバッファがfreeして良い(すなわち、mallocされている)のか、
静的に確保されたメモリ領域など、freeしてはならないのかは、
fcloseには分らないから、fcloseの実装でユーザがセットしたバッファを
freeすることはあり得ない。


624 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 04:55:22 ]
>>619
フツーに考えたら、freeされないと思う。
根拠はオレ。

仕様的には実装におまかせのはず。


625 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:34:44 ]
複数行マクロを書くときの体裁なんですが、
伝統的なdo{}while(0)ではなくvoidキャストを使うというのを見かけました
たとえばこんなんです

#define macro() { /* 処理 */; }(void)0

確かにこれでうまくいきそうに見えるのですが、本当の本当に大丈夫でしょうか


626 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:36:44 ]
>>625
if(hoge)macro();else foo;
でアウツだろ。

627 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:42:23 ]
なるほど

#define macro() if(1){ /* 処理 */; }(void)0

なら大丈夫ですか?



628 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:43:55 ]
違うか

#define macro() if(1){ /* 処理 */; }else (void)0



629 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:47:55 ]
問題は無いと思う。
まあ、そこまでするなら do { } while(0) の方がシンプルでいいと思うが。
これの問題は条件式が定数式の場合に警告吐くコンパイラがあるという点だが、
それが解決されてるわけでもないしね。

630 名前:デフォルトの名無しさん mailto:sage [2009/01/22(木) 22:54:28 ]
>>628 にはまだこの問題があるようだ。
macro(), foo(); /* foo() は実行されない */

631 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 09:01:12 ]
それはdo〜whileでも駄目なのでは?

632 名前:デフォルトの名無しさん mailto:sage [2009/01/23(金) 17:38:36 ]
do〜whileはコンパイルエラーになってくれる
628はコンパイル通って実行しないからタチが悪い

633 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 08:47:00 ]
#define macro() { /* 処理 */; }
だけではだめなんですか?

634 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 08:58:37 ]
if (hoge)
 macro(); /* ← 使う側はどういう定義になっているか知らないのでセミコロンをつけて書いちゃった */
else
 foo();

で文法エラーになる。
常に if に { } を付けるスタイルなら問題は無いが。

635 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 09:41:12 ]
なるほど。

636 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 09:42:54 ]
ともあれこのスレは、Cのイディオムについて語り合うスレではないな。

637 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 12:54:33 ]
>>636
誰がそんなこと決めた



638 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:00:48 ]
文法エラーではじかれるならまだOKですね。
変に動いて誤作動するよりは。

基本ifには{}をつけるので
#define macro() { /* 処理 */; }
でも問題ないですが、これだとMISRA-Cに怒られる・・・

639 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:43:46 ]
inline macro() { /* 処理 */; }
が一番だな

640 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:50:15 ]
inlineの基準はコンパイラによって違うそうですが、たとえばgccではインラインされるかどうかのある程度基準(仕様)があるんですか?

641 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:55:23 ]
inlineじゃなくて、static宣言された関数では?

642 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 18:55:54 ]
>>641
C99でinlineが入ったんだよ。

643 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 19:18:31 ]
inlineとstaticは同じ基準でインライン展開されるんですか。

644 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 19:19:07 ]
よーわからんけど、extern inline が使えるってこと?

645 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 20:40:50 ]
>>643
コンパイラ次第。
最適化レベルによって基準に差が出たり出なかったりする、なんてこともある。

646 名前:デフォルトの名無しさん mailto:sage [2009/01/24(土) 20:41:26 ]
>>644
inline 関数は常に内部リンケージ。

647 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 02:27:15 ]
最適化をしない設定ではinlineをしていしても無効になるコンパイラもあるしね。



648 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 05:53:01 ]
極端な話、今時inlineなんてregster程度の意味しかないと言ってもいい。

649 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 10:58:41 ]
register
 ・ C ではアドレスを取るとエラーになる(C++ では問題ない)
 ・ レジスタにするかどうかは 100% 無視される
inline
 ・ 最適化なしでは static 関数も inline 関数もインライン化されない
 ・ 最適化低では inline 関数はインライン化されるが static 関数はインライン化されない
 ・ 最適化高では static 関数も inline 関数もインライン化される

VC++ ではこんな感じだったと思う。
分岐する最適化レベルがいくらだったかは忘れた。

650 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 16:20:26 ]
>>649
ありがとうござます。
inlineはコンパイラによってインライン展開するかどうかは任意だと聞いてたんですけど、最適化を協力にすると任意じゃなくて必ず展開されるんですか
それと、static関数は必ずインライン展開されるんですか。困った話ですね。

ということは、インラインとしては展開できない関数はないですね(つまり必ずマクロ関数みたくなる)。
inlineは最適化から出てきた機能ですが(関数専用の)テンプレートに近くなっているということでしょうか。

651 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 16:23:03 ]
>>650
いやいや、必ず展開されるという意味で書いたわけじゃない。
「インライン化されない」と書いた部分は「必ずインライン化されない」が、
「インライン化される」と書いた部分は「インライン化される可能性がある」の意味で書いた。

652 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 16:44:33 ]
今のハードなら展開されようが、されまいがどうでもいいんじゃないの。
関数呼び出しコストなんて測定できないような時間(ナノ秒単位)で、普通は参照渡し。
組み込みとかセットボックスみたいだとハード資源が限られてるからループ内部とかでやれば多少効果はあるかもしれない。

653 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 16:53:46 ]
画像処理とか激しいループは未だにあるもんだ。

654 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:36:24 ]
インライン展開することによる最適化も期待できるから
>>652 は世間知らずだな としか思えない。

655 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:44:03 ]
static以外の関数でも最適化を上げればインライン展開されると思うよ。
外部リンケージ用に、通常関数版も用意されるはずだけど。

656 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 17:49:42 ]
まあそこらへんは規格に反しない限りはコンパイラが自由にやっていいことだからなぁ

657 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 18:53:36 ]
ファイルのリンケージを考えれば、どっちでもいいということですね。
オブジェクトファイルのサイズが増えても今のハード(携帯なども含む)なら微々たる物でしょうし。
気にしているのは、DLLみたく他人がつかうとき、それが関数のつもりがマクロみたく展開されてると不都合が生じるってことです。
関数ポインタのときとか。



658 名前:デフォルトの名無しさん mailto:sage [2009/01/25(日) 22:09:36 ]
>>657
> 気にしているのは、DLLみたく他人がつかうとき、それが関数のつもりが
> マクロみたく展開されてると不都合が生じるってことです。
> 関数ポインタのときとか。

意味わからん、inline の意味わかってるのか?

659 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:18:35 ]
実行時の関数呼び出しとコンパイル時のインライン展開の違いはわかってる?

660 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:20:50 ]
inline 関数の中に malloc があったとき
どっち側でメモリが確保されるのかは気にはなる。

661 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:25:31 ]
何側と何側の話をしているんだ

662 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:29:45 ]
DLL側とDLLを使用している側

663 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:31:33 ]
説明する気もうせる

664 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:33:09 ]
スレチだしな

665 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 00:38:12 ]
いいぞもっとやれ

666 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 01:01:17 ]
>>658-659

inline void func();

これを(*func)と関数ポインタで使うときどうなるんでしょうか?
例えばqsortに渡したりするときも、qsortみたいな関数ポインタを受け付けるAPIは実行時評価が目的の設計なので、
インライン展開されると不都合な気がするんですけど。

static関数もファイルスコープにおいて展開されるのは初耳だったんですけど、同じように実行時に不都合がありませんか?

667 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 01:20:20 ]
memcmp、strcmp、strncmpの返値だけど

The memcmp function returns an integer greater than, equal to, or less than zero,
accordingly as the object pointed to by s1 is greater than, equal to, or less than the object
pointed to by s2.

これはつまり、a > b > c だとしても、
memcmp(a, b, n)で100を返し、memcmp(a, c, n) で1を返してもいいんですよね?
0より大きいか小さいかだけが問題で。
accordinglyってのは、「大きい小さい等しい」に従うだけで
数値に従う必要はないですよね?



668 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 01:21:53 ]
うん。

669 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 01:29:38 ]
>>666
上で誰かが書いていたと思うけど、必要なら普通の関数のコードも併せて作るだけ。

670 名前:デフォルトの名無しさん mailto:sage [2009/01/26(月) 05:22:44 ]
>>669
私だよん。

>>666
たまにはアセンブリ出力を眺めてみるもんだよ。
個々の行の意味が判らなくても、全体のボリュームとシンボルの位置でいろんなことが見えてくる。

>>667
その通り。実際、1,0,-1しか返さない処理系もあった筈だし、
最初に不一致だったバイトの差分を返す処理系もあった筈。

671 名前:デフォルトの名無しさん [2009/02/14(土) 05:16:14 ]
ctype.h の関数を手持ちの char について使いたいときは、 char が符号付の場合を考慮して
unsigned char にキャストしないといけないことを理解しました。

でも toupper() の戻り値 int は引数と同じ範囲の値を取るので、そのまま char に戻すことが
できないように思います。

たとえば char 型の変数 c について、以下の条件をすべて満たすとき。
- (unsigned char)c == UCHAR_MAX
- UCHAR_MAX > CHAR_MAX
- toupper(UCHAR_MAX) == UCHAR_MAX ※変換なし
c = toupper((unsigned char)c) という式は char には収まらない UCHAR_MAX を
char に変換することになり、符号付整数のオーバーフローにより未定義動作と
なってしまいそうです。

任意の char 型の値を大文字に変換して結果を char 型で得る方法として、
未定義動作も実装依存も回避した移植性のある方法はあるのでしょうか?

現実的には黙って char に変換すればいいように実装されてることが期待できるとは
思うのですが、ちょっと気持ち悪いです。

672 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:29:40 ]
なんか、とても杞憂な気がするるが、神経質にするならこうか?

c= isalpha((unsigned char) c) ? toupper((unsigned char)c) : c;

673 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:42:03 ]
気になってるのは、大文字アルファベットの表現がsinged charで負値になる環境とかだよね。

全く規格確認してないが、intの戻り値retについて、
CHAR_MINが負値でretがCHAR_MAXを超える場合、
自力でunsigned charをcharに変換するコードを書けば
とりあえず解決するんじゃね?

1バイト文字の英数がASCIIで無い処理系ってあんま想定したこと無いから分からないけども、
「ASCIIじゃなきゃダメ」って記述は規格には無かった気がするなぁ。
詳しい人フォローよろしく。

674 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 07:44:12 ]
fgetc() なんかも同じだよね。とりあえず EOF をチェックして、それが済んだら char として
扱いたいんだけど、変換できるの?っていう。

675 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 09:13:41 ]
>>671
そもそも規格上は unsigned char を signed long するだけでだめなケースがあるから

> 未定義動作も実装依存も回避した移植性のある方法はあるのでしょうか?

の答えは「ない」だよ。

>>673
> 「ASCIIじゃなきゃダメ」って記述は規格には無かった気がするなぁ。

汎用機用の C言語処理系で文字コードが EBCDIC のものがある。

676 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 09:45:53 ]
>>671
toupper に正しく小文字を与えれば、正しく大文字になるでしょ?
それ以上のものはないよ

UCHAR_MAXを toupper に与えたらUCHAR_MAXが返るだろうけど、
そもそもなんでその結果を signed char にキャストするの?
UCHAR_MAXを与えるということは signed char じゃなかったんでしょ?

>>674
toupper()やfgetc()の結果をcharと比較したい場合、
charに変換して戻すんじゃなくて、比較先をintにするのが普通では?

 int c = fgetc();
 if ( c == 'a' ){
   …
とか

677 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 10:11:11 ]
>676
明示的に UCHAR_MAX を与えるわけじゃなくて、unsigned char に変換すると UCHAR_MAX になる値が
char としてあった場合に、unsigned char にキャストしてから toupper に与えた場合とか。

> toupper()やfgetc()の結果をcharと比較したい場合、
比較ならいいけど、char に代入したくなったらどうするの?
例えば、文字列中の小文字を全て大文字に変換する関数 strupper(char*) を定義しようとかいう場合。
やっぱ >672 のように書けってことだろうか。



678 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 10:13:56 ]
>>676
> toupper()やfgetc()の結果をcharと比較したい場合、

単純比較なんて誰も悩んでないと思うが。
配列に入れて、printf() で出力したい時とか考えつかないわけ?

679 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 11:51:23 ]
signed char が -127〜127 で文字コードが 0〜255 の環境なら、
処理系は char を unsigned char 固定で扱うようになっているんじゃないのか?
じゃないと char が文字コードを収める事ができるという
最低条件をクリアできないじゃん。

680 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 11:56:18 ]
>>677
>>unsigned char にキャストしてから toupper に与えた場合とか。

だから、なんでキャストするの?

入力が signed char なら signed char → int に変換されても
UCHAR_MAX はありえない。

入力が unsigned char なら UCHAR_MAX はありうるけど、それは
変換前も変換後も UCHAR_MAX のままでしょ


681 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 13:17:25 ]
>>680
ふふ、

682 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 13:24:25 ]
一連のレスで、UCHAR_MAX は一例だと思うよ。
問題は、signed charで表せないのにunsigned charで表せる文字
ではなくて、signed charで負の値になるunsigned charの文字
ではなかろうか。このような文字を安全に
unsigned char から signed charに変換する標準的な方法が無いこと。

もう一つは、toupperの引数は非負が仮定されているので、
toupperの引数は(intだけど)数値としては実質的にunsigned char
を渡す事になる。

この二つの問題が絡み合っているのね。

683 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 15:38:04 ]
>680
unsigned char 範囲の値を渡せって規格で要求されてるから。
> 9899:1999 7.4
> The header <ctype.h> declares several functions useful for classifying and mapping
> characters. In all cases the argument is an int, the value of which shall be
> representable as an unsigned char or shall equal the value of the macro EOF. If the
> argument has any other value, the behavior is undefined.

684 名前:680 mailto:sage [2009/02/14(土) 22:52:12 ]
>>683
その文章は知ってるよ。
でもそれは toupper の引数は unsigned char でキャストしろ、って意味.じゃない
signed char を指定した場合で -2 〜 -128 の場合は undefined だよ、って言ってるだけ
(EOFが-1として)

685 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:14:28 ]
実際死ぬケースもあったな。マイナス与えると。
日本語扱うとよくある。

686 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:16:35 ]
> 未定義動作も実装依存も回避した移植性のある方法はあるのでしょうか?
最初っから全部unsigned charにしとけでイナフ

687 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 00:23:38 ]
>>679 についてはどうなんだ?



688 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:03:33 ]
>>684
未定義動作を回避するのに、 unsigned char にキャストするほかにどうすんの?

689 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:06:46 ]
>>679
basic character set に無い処理系依存の拡張文字の char としての値について、
符号も含めて規定は無いから、負の値が拡張文字に対応しても問題なさそう。

6.2.5 Types p3
> An object declared as type char is large enough to store any member of the basic
> execution character set. If a member of the basic execution character set is stored in a
> char object, its value is guaranteed to be nonnegative. If any other character is stored in
> a char object, the resulting value is implementation-defined but shall be within the range
> of values that can be represented in that type.

690 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:11:07 ]
>684
じゃ、
> signed char を指定した場合で -2 〜 -128 の場合
はどうすれば?
範囲チェックして toupper には渡すなって主張?

>687
0〜255 だというなら確かにそうかもね。
> 9899:1999 6.2.5/3
> If a member of the basic execution character set is stored in a
> char object, its value is guaranteed to be positive. If any other character is stored in a
> char object, the resulting value is implementation-defined but shall be within the range
> of values that can be represented in that type.
という記述を見ると basic execution character set 以外なら負値も認めているように読めるけど、
後は実装依存の闇の中、かな。

691 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:22:17 ]
int toupper(int c);

692 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:22:20 ]
なるほど・・・。
完全に環境無依存のコードは無理っぽいね。

693 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:55:08 ]
卓上の妄想なら不可能だが、現実的にはみんなやってるだろ

694 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 01:59:26 ]
なんで文字を扱ってるのに符号を気にしなきゃいけないんだよC言語のバカ!

695 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 02:11:42 ]
char の符号が未規定なのって
どんなケースを想定してのことなのだろうか。
符号つきの文字コードがあったらいけないから?

696 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 02:18:33 ]
8 bit 符号付でも ASCII の表現には十分だから実装任せで良いよね。
っていう話だと思う。

C++ では char を受けて char を返す toupper/tolower があるから、今さら
規格を変更する(変更を検討する)モチベーションも無いだろうしなぁ。

697 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 04:13:14 ]
リアルタイムの人間じゃないけど。
規格がまとまる前にsigned, unsigned両方の実装が出ていたから、
というのが最大の理由だったと思う。
そこから先は>>696のとおり。



698 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 09:07:58 ]
int は、ディフォルトで signed なのに、char のディフォルトを決めなかったのが
敗因だと思う。

まあ今時だとメモリも潤沢だからわざわざ char に詰め込もうなんて思わないけど、
当時だと short short int の役目もあったのかもしれないな。

699 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 10:18:39 ]
MS-cがオプションでcharをアンサインドにできる仕様だったからねぇ。
intとは事情が違うね。

700 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 10:52:13 ]
lattice-c(2のころ)はunsignedだったっけ?

701 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 11:12:02 ]
>>688
出力を未定義にしたくないなら、未定義にならない引数を与えろってこと。
toupper呼ぶ前に、入力文字の範囲チェックしないってことは無いだろう普通

それを unsigned char へのキャストで済ませられたらいいな、と
考えたのだろうけどそれじゃダメって話

702 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 11:29:04 ]
>>701
範囲をどうチェックするするべきだと言うの?
チェックで範囲外だとわかったらどうしろっていうの?
toupper() に渡さないと大文字にできんのだが。

703 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:16:42 ]
馬鹿なの?
大文字にしたければ小文字を渡せよ
if( isascii(c) && islower(c)) c = toupper(c);

これを
c = toupper((unsigned char)c);
とすると規格上不定になります(;_;)とか言ってるから
キャストするからだろ馬鹿、って言ってるんだ

704 名前:デフォルトの名無しさん [2009/02/15(日) 12:23:28 ]
大馬鹿なの? toupper の前に islower なんかいらねーよ

705 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:23:30 ]
>>703
標準の範囲で実装依存せずにどうするかって話なのに、
非標準の isascii() とか入れてみたり勝手に ASCII 大文字だけに要求を絞ったり、
ギャグでやってるのか?

706 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 12:37:08 ]
いいえ、ボールギャグです。

707 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:08:42 ]
で、実際のところa-z|A-Zが符号付き表現で負になることはありえるの?



708 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:11:34 ]
それは知らないけど、
"C" locale以外ではa-z|A-Z以外でもislower/isupperが真になるということなら有り得ると思う。

709 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:12:31 ]
真になるってどういう事だよ。

710 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:13:04 ]
あ、空目してた。ごめんよ。

711 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 15:14:32 ]
結局は>>686

712 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 16:26:35 ]
>>707
そいつらは basic execution character set に入ってるから char 型の符号の有無に
かかわらず負にならないことが保証されてる。 ( >689,690 が引用してる箇所参照)

713 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 17:39:56 ]
>>712
素朴な疑問、EBCDIC な文字コードの処理系の場合どうなるんだ?


714 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 18:09:27 ]
>>713 文字コードは関係ない。( >689,690 が引用してる箇所参照)

715 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 18:30:21 ]
>>714
EBCDIC って 8bit だと MSB たってんじゃん, char 9bit 以上で実装しろって話?


716 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 19:33:50 ]
>>699
MS-C はシフトJIS でトラブル奴が多いからそういうオプションを
サポートしただけだろ。

717 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 19:35:12 ]
>>715 EBCDIC のコードを 8 bit char の値に使うなら char 型を unsigned にするしかないということ。



718 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 20:08:24 ]
>>717
fgetsやprintfやstrcmpなどの型も全部変更するの?

719 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 20:11:42 ]
>>718
きっと何か勘違いしてると思うけどそれらの関数でどういう問題が起きると思うの?

720 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 21:19:58 ]
>>718
unsigned charにするんじゃなくて、
char自体を符号無しにするってことだろ。

721 名前:デフォルトの名無しさん mailto:sage [2009/02/15(日) 22:46:22 ]
>>717 ああ、それなら納得
>>712 char 型の符号の有無にかかわらず負にならない」
てな、書き方はやめてほしかった


722 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 04:13:51 ]
今現在、charをsignedで使う意味ってあるのかな。


723 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 15:09:34 ]
>>722
charを文字ではなく数値として使うこと考えれば。
intへの昇格も考えなきゃならんし。

724 名前:デフォルトの名無しさん [2009/03/01(日) 00:55:23 ]
C言語なら俺に聞け(入門篇) Part 45
pc11.2ch.net/test/read.cgi/tech/1235044065/l50

こっちが埋まったんで、とりあえずageておく。

725 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 03:16:58 ]
あのグダグダを持ち込まれても困るんだが

726 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 21:51:47 ]
ネタ切れ? じゃぁ

問題:

int i, j;

int main()
{
i = 1;
j = i++ * i++;
printf("%d, %d\n", i, j);
}

このプログラムを実行するとどうなるか? どうなるべきか? 結果もしくは挙動を推測せよ。
(includeとかmainの型なんかは、適宜補え。文句言うな)

727 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:17:00 ]
jの右辺が未定義動作だから何が起こるかわからない

「3,6」と表示されるかもしれないし「3,9」と表示されるかもしれないし
「5196823, -98600289」と表示されるかもしれないし「qあwせdrftgyふじこlp;」と表示されるかもしれないし
プログラムが異常終了するかもしれないしOSがクラッシュするかもしれないし
PCが火を噴くかもしれないし地球が爆発するかもしれないし鼻から悪魔が出てくるかもしれない

常識だと思うが、今更どうした



728 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:54:37 ]
mainが値を返してないからコンパイルできない

729 名前:デフォルトの名無しさん mailto:sage [2009/03/01(日) 22:56:00 ]
C99なら可だが

730 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 11:15:52 ]
鼻から悪魔は無いな、たぶん。

731 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 20:09:45 ]
出てきてからじゃ遅いんだよ、出てきてからじゃ。

732 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 21:31:38 ]
ネタ切れ? じゃぁ

問題:

int a[32], b[32], *p = a;
if (p < b || b + 32 <= p) printf("悪魔が出る。");
else printf("いずれにせよ悪魔が出る。");

このプログラムの断片について議論して。前後は適当に補ってね。


733 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 21:50:06 ]
どこにも悪魔は出ないだろ・・・
b + 32 は脱参照しなければ合法だし
ポインタは順序付け可能だ(どういう順序になるかは未規定だが)

734 名前:デフォルトの名無しさん [2009/03/02(月) 21:55:05 ]
p < b の大小関係が未規定ゆえ、結果が未定義となる

735 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:14:11 ]
どういう順序になるかは未規定だが
順序付け可能とは定義されてるよ

736 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:14:47 ]
結果は未定義じゃなくて未規定
少なくとも鼻から悪魔は出ない

737 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:17:06 ]
When two pointers are compared,
<ばっさり省略>
In all other cases, the behavior is undefined.




738 名前:デフォルトの名無しさん [2009/03/02(月) 22:24:43 ]
未規定の動作が生じうる可能性のうちのいずれかに依存したコードには可搬性があるというのか?

739 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:25:46 ]
ばっさり省略しすぎだろwww
同じ型なら比較可能だ

740 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:28:54 ]
>>739
俺も今6.5.8をみていたところだが

> 同じ型なら比較可能だ

これはどこに書いてある?

741 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:29:03 ]
>>739
同じ型でも違うオブジェクトであればだめだよ。

742 名前:デフォルトの名無しさん mailto:sage [2009/03/02(月) 22:40:59 ]
ああ、Cだとダメなのか。
C++だといいからCでもいいのかと思った。

743 名前:デフォルトの名無しさん mailto:sage [2009/03/03(火) 21:56:44 ]
>742
C++ でも駄目だろ、と思ったけど未規定なのな。
そして std::less とかだと全順序保証、と。

744 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:43:13 ]
Cだとポインタを二分探索木で管理するには
その先の値を見るしかないのか。
その先の値の順番に特に意味が無くても。

745 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 00:54:51 ]
>>744
先の値の順番に意味がなかったらなにを基準に木構成する気だ

746 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 11:51:54 ]
ポインタのアドレスそのもので探索する?

747 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:05:25 ]
連続メモリ空間上のポインタなら二分木で管理するまでもないし
そうでないなら比較の保障がない以前に意味がないだろ



748 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 13:05:56 ]
×空間上のポインタ
○空間上へのポインタ

749 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 22:25:15 ]
>>744
この世にはデリファレンスできないポインタも存在するわけだが。

750 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 23:54:43 ]
int にキャストして比較すれば良いんじゃない

751 名前:デフォルトの名無しさん mailto:sage [2009/03/04(水) 23:56:45 ]
そしてオーバーフローするんですね、わかります

752 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 10:58:14 ]
>>750
その比較が意味のあるものとなる保障はない。
それに>>751がいうようにintじゃだめだろう。

753 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:11:20 ]
ポインタをポインタと同じサイズの整数型に変換可能な事は保証されてるから
uintptr_t 使うならええんでないかい?

754 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:14:22 ]
それなら問題ないよ。

755 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 12:06:23 ]
double v;
としてvがnanやinfinityであるかを判定するにはどうやるんでしょうか?
標準ライブラリ見てもそのような関数が用意されてないので困っています。
v!=vでnanなのは分かっているのですが、他に方法はないのでしょうか。
それと、実数のときと複素数のときの判定方法を教えてください。
一応GCCです。

756 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 12:33:17 ]
>>755
-std=c99 でisnan、isinfあたり。

757 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:06:48 ]
c99にすれば用意されているのですが、コンパイラ・オプションで指定しないと標準ではinf, nanは判定できないって事ですか?



758 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:20:38 ]
>>757
いちおう、 C99 は「標準」だよ。

gcc のデフォルトは C99 じゃないけど、拡張の一部として isnan, isinf は
使えたりするかもしれない。っていうか、試せばいいよ。

759 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:40:11 ]
そういえばinfinityの判定はやったことなかったけど、今までみんなはどうやってたんだろう・・

760 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:42:21 ]
>>756に書いてあるじゃんw

761 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 13:54:44 ]
古いAPIを読んでたのでなかったんですが、今後はコーディングするときはC99準拠で必ずやることにします。

762 名前:デフォルトの名無しさん mailto:sage [2009/03/21(土) 14:02:39 ]
昔も標準でなかっただけで普通にあった。
isinfinity()の環境もあった。

> 今後はコーディングするときはC99準拠で必ずやることにします。

素晴らしいです。


763 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 10:12:15 ]
restrictとか可変長配列とか勝手に使うと迷惑になることもあるから気を付けろよ
個人ならいいけど

764 名前:デフォルトの名無しさん mailto:sage [2009/03/22(日) 14:04:37 ]
>>763
kwsk

765 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 13:18:20 ]
>>764
c99ではrestrictは予約語。iccだとオプションを指定すればc++でも使える。

766 名前:デフォルトの名無しさん mailto:sage [2009/03/23(月) 16:59:58 ]
ところで今の規格準拠コンパイラは複素数のinf, nanを判定できるのか?

767 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 01:41:09 ]
Cに複素数なんて概念あったっけ?



768 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 05:50:48 ]
>>767
c99

769 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 06:37:18 ]
いい加減、このスレの参加資格に、C99の規格書を読むことを入れとこうぜ

770 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:36:52 ]
まあseclan.dll.jp/c99d/くらいは参照した方がいいかと。

771 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:48:37 ]
確かに2009年にもなってC99を知らんのはこのスレ的にはお断りだ
Cを知らないに等しい


772 名前:デフォルトの名無しさん [2009/03/28(土) 09:50:19 ]
旧規格もそうと断ったうえでなら可だろ
事実上まだ現役だし

773 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 10:24:27 ]
C99を実際には使わなくても
知っていなくてはこのスレにいる資格は無いな

774 名前:デフォルトの名無しさん [2009/03/28(土) 10:34:44 ]
まあ複素数は置いといて、何かを知らないことをもって C99 を知らないことにされたら
資格者ほとんどいないんじゃね?

775 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 10:49:42 ]
今規格をあたろうとすると必然的にC99になるからそうでもないと思うが

776 名前:デフォルトの名無しさん [2009/03/28(土) 10:58:12 ]
それなら C99 を「知っている」のではなく「規格票にアクセスできる」ことが資格というべきではないか?

777 名前:デフォルトの名無しさん [2009/03/28(土) 10:59:29 ]
# 今日はここまで、遊びに出かける



778 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 11:00:14 ]
でも最低でも>>770くらいのことは知っておいて欲しい

779 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 12:46:04 ]
コンパウンドリテラルとか便利だけどね。
ただどれがGCC拡張か規格機能なのかよく分からないことがよくある。
それよか、API文章をC99対応にしないと広まらないだろう。
とくにMSDNが率先してC99に対応しないとGNU方面の人たちだけになるんじゃないか?
MSはカオスだしそのうち空中分解しそうだけど。

780 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 13:42:40 ]
>>779
> MSはカオスだしそのうち空中分解しそうだけど。
突然それまでの話と関係ない一言を最後に入れるあたり、天声人語かと思った

781 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 13:58:20 ]
コンパウンドリテラルはC++にも欲しい

782 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 14:24:48 ]
コンストラクタ主義と
コンパウンドリテラルは合わない。

デフォルトコンストラクタのみなら、
リスト初期化子の記法で何とかなりそうではあるけど。

783 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 14:28:01 ]
配置newで乗り切る。

784 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:09:28 ]
配列のコンパウンドリテラルの代わりになるものは
C++0xにあるんだっけ?

785 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 15:36:26 ]
まだバタバタしてますがこれ。
Initializer List
www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm

initializer-list constructorってのがあって(以下上の提案参照

786 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 21:27:50 ]
C90に準じていても、それをゆるさない車載標準規約であるMISRA-C。
マジでうざい規約です・・・

787 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 22:21:01 ]
>>785
かなりバタバタしてる雰囲気がするねw



788 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 09:28:51 ]
union { char a[4]; int i } u;

というような共用体があったとき、
u.a[0]〜u.a[3]に代入した後、それをu.iで参照するのは未定義でしょうか?
6.5のeffective typeの説明を読む限りではそうなってしまいそうなんですが。
未定義でないとすると、その根拠は規格のどの辺で規定されています?

789 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 10:43:24 ]
The effective type of an object for an access to its stored value ... ってとこ?
どこに未定義って書いてある?

790 名前:デフォルトの名無しさん [2009/03/29(日) 11:11:42 ]
> 4. 規格合致性
> この規格では,このほかに,用語“未
> 定義の動作”を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこ
> ともある。

791 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 11:13:29 ]
>>788
参照はして構わない。値は未定義。

792 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:31:08 ]
多くの実装ではこちらが期待したとおりのビット列として読み出すことができる
しかし規格上は、ある型で与えた値を別の型で読み出せることは保障していない

結論:自己責任

793 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:49:17 ]
>>792
実装の説明には書かれているものなのかな?
たとえば、gccとか。

794 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 12:54:16 ]
規格で保証してないことを保証してるなら、書いてあることもある。

gccでは保証してないどころか、予想だにしない結果になるんじゃなかったっけ?
-O2 とかだと。

795 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:04:43 ]
いやalignとかpaddingとかオプションで指定できるし。> gcc
それにconfigureで確かめたり、実行時にassertしたりできるでしょ。

ただ何がやりたいのか不明だけど、勝手に想像すると、今時のマナーでは、
#include <stdint.h>
union { uint8_t a[4]; int32_t i; } u;
とするんじゃないのかな。



796 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:08:39 ]
何が今時なのか分からん。

797 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:12:49 ]
sizeof(int) == 4と仮定しない方がいい→今時




798 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:13:10 ]
>>796
サイズが同じなら、予想した動作になるってことかな?

799 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:13:53 ]
charとuint8_tが等価なのも今時なのか?

800 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:18:32 ]
粘着乙

801 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:54:11 ]
char だと 0x80 の値が使えないかもしれないジャマイカ

802 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:57:04 ]
charが9ビット以上である可能性がな・・・

803 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 13:57:58 ]
>>801
いや、もともとcharで切ってたならcharとしての使い方しかしないでしょ。
なんでuint8_tにするの?ってことなんだけど。

804 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 14:11:03 ]
>>803
何言っているか意味がわからんが?

> charとしての使い方しかしないでしょ。

ここはC++スレじゃないぜ?

805 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 18:55:14 ]
C++が何で関係あるのか分からんが
もともとcharで切ってる事自体、
本当によく考え抜かれたものか怪しいことは確か

806 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 19:05:34 ]
結局 >>788 批判ですかw


807 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 20:06:01 ]
C++が何で関係あるのか分からんやつは答えなくてよろし



808 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 21:02:11 ]
みなさま、ご回答ありがとうございます。
intとcharは例が悪かったかも知れませんが、
相談の主旨は

union U { t1 m1; t2 m2; } u;

(ただしt1とt2はcompatibleでない)

に対して、u.m1に書き込んだ値をu.m2で読み込んだときの
言語仕様についてでした。
例だと、

uの表すobjectのeffective typeはunion U
u.m1の表すobjectのeffective typeはt1
u.m2の表すobjectのeffective typeはt2

になるわけですが、u.m1とu.m2の表すobjectが同じものと考えれば、
1つのobjectがt1とt2という2つのeffective typeを持つ。
だから、u.m1に書き込んだ値をu.m2で読み込むのは許される。
ただし、読み込まれる値については未規定である。

という理解でよいのでしょうか?

809 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:29:36 ]
そだね。

810 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 22:32:37 ]
CとC++でcharの扱いが全く違うことは、
まあスレ違いなんで知らなくてもいいけど、
Cのcharがintegral typeでintegral promotionの対象、
ANSIでも"as is"が認められているだけってことは知っておかないと。

811 名前:デフォルトの名無しさん mailto:sage [2009/03/29(日) 23:44:30 ]
>>809
適当なことを言わないように

812 名前:デフォルトの名無しさん mailto:sage [2009/03/31(火) 08:00:10 ]
Cの言語仕様というと、俺はいまだにK&Rなんだが。

813 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 22:59:50 ]
>>788
どうせおもいっきり環境依存なんだから、
面倒なことしないで、
char a[4]; にセットして
*(int*)a で読んじゃえ。


814 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:08:51 ]
>808
> になるわけですが、u.m1とu.m2の表すobjectが同じものと考えれば、
とあるが、共用体のメンバに対応するオブジェクトはすべて同じなのか?
大きさも型も違うのに。

むしろ同じアドレスだけど、オブジェクトは別と考えるのが自然だと思う。

815 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:15:21 ]
static_assert(期待通りの値が入ってるかどうか) をどっかに入れておけばいい。

816 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:15:40 ]
>>813
strict aliasing rule違反じゃね?どうなの?

817 名前:デフォルトの名無しさん mailto:sage [2009/04/01(水) 23:30:28 ]
>>816
大丈夫なCPUとダメなCPUがある。
x86系は大丈夫。

逆の方が適用可能な範囲が広いか。
int a; を ((char*)&a)[0〜3] で書く。




818 名前:デフォルトの名無しさん mailto:sage [2009/04/02(木) 02:58:14 ]
>>816
違反。

逆に int a; を用意して (char*)&a 経由でセットし、その後 a を読むのなら OK 。

819 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:23:29 ]
なんでC言語には累乗計算の為の演算子がないのですか?

820 名前:デフォルトの名無しさん mailto:sage [2009/04/05(日) 00:43:38 ]
累乗計算命令を積んでるCPUが少ないからだ






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<178KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef