トップページ⇒tech
1002コメント314KB

C言語なら俺に聞け! Part 135©5ch.io

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん 転載ダメ©2ch.net2016/05/10(火) 13:13:49.45ID:3fG5/CbC
Language C FAQ
http://www.kouno.jp/home/c_faq/

K&R
プログラミング言語C 第2版 ANSI規格準拠
http://www.amazon.co.jp/dp/4320026926

C99
JIS X 3010:2003 プログラム言語C
http://kikakurui.com/x3/X3010-2003-01.html

C11
ISO/IEC 9899:2011 - Information technology -- Programming languages -- C
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853
価格:198 CHF
----
C言語なら俺に聞け
http://echo.2ch.net/test/read.cgi/tech/1408709181/
2014/08/22(金)

【初心者お断り】ガチ規格準拠C専用スレ Part133
http://pc11.2ch.net/test/read.cgi/tech/1201153965/
2008/01/24(木)

【ISO/ANSI/JIS】 C言語なら俺に聞け! Part 132
http://pc11.2ch.net/test/read.cgi/tech/1190261457/
2007/09/20(木)
0809デフォルトの名無しさん2016/06/20(月) 08:24:06.00ID:KuHDgHp4
>>802
§6.5.3.4
2.
The sizeof operator yields the size (in bytes) of its operand, which may be an
expression or the parenthesized name of a type. The size is determined from the type of
the operand. The result is an integer. If the type of the operand is a variable length array
type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an
integer constant.

evaluateが実行時だとは明言されてないけど
そうじゃないと評価してはいけないということになってしまうから実行時評価がダメってことだろ
整数定数になるとも書いてあるし
0810デフォルトの名無しさん2016/06/20(月) 08:32:02.75ID:ZolMwWER
>>808
なってません
0811デフォルトの名無しさん2016/06/20(月) 09:25:58.23ID:usQ28XEZ
VLAだけであればC++11どころかC++03でも使える
C言語ではC90では無理だけどC99であれば使える
ただどちらも宣言時のサイズ指定に変数が使えるだけであって、実行時のサイズの動的変更は出来ない
0812デフォルトの名無しさん2016/06/20(月) 09:39:36.17ID:ZolMwWER
>>811
なんでこれだけ標準ではないと言ってても調べもせずにそんな事いえるの?
0813デフォルトの名無しさん2016/06/20(月) 09:55:39.62ID:KuHDgHp4
少なくともc++11のドラフトでvariable length arrayで検索してみたところ該当0だな
c11ならいくつもでるけど
0814デフォルトの名無しさん2016/06/20(月) 10:08:53.26ID:usQ28XEZ
C99でのVLAの例、C++03でも構文は同じ
https://en.wikipedia.org/wiki/Variable-length_array
0815デフォルトの名無しさん2016/06/20(月) 10:11:34.42ID:ZolMwWER
話が通じないみたいだ
0816デフォルトの名無しさん2016/06/20(月) 10:11:44.95ID:yf+QHXB8
C++のほうは1zでようやくドラフト段階だったはず
0817デフォルトの名無しさん2016/06/20(月) 10:13:10.21ID:KuHDgHp4
>>814
えっ、どこにc++03でも同じって書いてあるんですかね
0818デフォルトの名無しさん2016/06/20(月) 10:19:18.65ID:usQ28XEZ
むしろC++03でwikiのサンプル例でエラーが出る処理系を教えてほしい
0819デフォルトの名無しさん2016/06/20(月) 10:32:36.98ID:ZolMwWER
>>818
MSVC
0820デフォルトの名無しさん2016/06/20(月) 10:45:25.73ID:usQ28XEZ
msvcはもともとVariable length arraysに完全対応していないことを明言してるなんちゃってC++/C処理系
https://msdn.microsoft.com/en-us/library/zb1574zs.aspx

>Variable length arrays are not currently supported in Visual C++.
0821デフォルトの名無しさん2016/06/20(月) 10:47:39.38ID:ZolMwWER
>>820
規格にねえつってんだろうが
日本語読めねえの?
0822デフォルトの名無しさん2016/06/20(月) 10:53:44.69ID:WkXFvEEF
C99で規格化されC11でオプショナルに降格だろ
つかmsvcが準拠してるのはC89?
0823デフォルトの名無しさん2016/06/20(月) 10:58:41.00ID:KuHDgHp4
>>820
個別のコンパイラの話してどうすんだよ
c++03っていうのはc++03の規格の意味であって
あらゆるc++03コンパイラを名乗る者の中で一番多い実装がc++03ではないの
そこら辺分かってない人わりといるよな
0824デフォルトの名無しさん2016/06/20(月) 10:58:55.23ID:ZolMwWER
>>822
今はC++の標準かどうかについて話してんの

g++やclang++でも -pedantic 付けると警告でる 厳格モードにするとなんちゃってC++処理系だとでもいうんだろうか?
まあスレ違いだし話通じないしもう黙るわ
0825デフォルトの名無しさん2016/06/20(月) 11:03:22.54ID:WkXFvEEF
ややこしいから「C++においては」を頭に付けてくれ
0826デフォルトの名無しさん2016/06/20(月) 14:12:18.68ID:p6+rLIxN
>>755
コンピュータのメモリ上のデータは全て値だから当然だろ。
0827デフォルトの名無しさん2016/06/20(月) 14:14:10.68ID:p6+rLIxN
>>797
手抜きだろ
0828デフォルトの名無しさん2016/06/20(月) 14:40:44.49ID:o/Q8QvES
>>827
実行時にどうやって決定するんだろうね
0829デフォルトの名無しさん2016/06/20(月) 15:47:38.33ID:y3bGvat/
ここってC言語スレであってる?
それともC++?
0830デフォルトの名無しさん2016/06/20(月) 15:48:50.28ID:7O0ObdXP
タイトル見る限りはC言語らしいけど
違う話題をしたがる人がいるみたい
0831デフォルトの名無しさん2016/06/20(月) 17:40:16.12ID:bEvQuIcU
あ
0832デフォルトの名無しさん2016/06/20(月) 19:31:58.70ID:qR6j9JAZ
++が両目で、Cが耳で、?が手で頭を掻いているところ
C++?
0833デフォルトの名無しさん2016/06/20(月) 20:37:31.93ID:FhfmjeRD
C は C + + の サ ブ セ ッ ト な の で !
0834デフォルトの名無しさん2016/06/20(月) 20:51:31.85ID:aMWLLxK3
糞ソースでも何とか追跡する気になるのがC、
追跡する気が全く起きないのがC++
0835デフォルトの名無しさん2016/06/21(火) 12:46:36.31ID:ScjYRl6x
1 (sizeof char)
2 (sizeof short)
4 (sizeof int)
8 (sizeof long)
8 (sizeof long long)
4 (sizeof float)
8 (sizeof double)
16 (sizeof long double)
8 (sizeof void *)
1 (sizeof int_least8_t)
2 (sizeof int_least16_t)
4 (sizeof int_least32_t)
8 (sizeof int_least64_t)
1 (sizeof int_fast8_t)
8 (sizeof int_fast16_t)
8 (sizeof int_fast32_t)
8 (sizeof int_fast64_t)

intが最速の型というのは迷信
int_fast8_tはchar=1byteの影響なのか最速ではない(他の3つを見る限り)

という解釈で合ってる?環境はlinux 64bit + clang 3.8.0
0836デフォルトの名無しさん2016/06/21(火) 13:44:31.02ID:1EIBrQuV
キャッシュのミスヒットのペナルティがデカいので
レジスタサイズに合わせたら必ず最速になるというものでもない
0837デフォルトの名無しさん2016/06/21(火) 14:35:10.28ID:ScjYRl6x
キャッシュの制御なんて言語仕様の範囲外なのでは?
0838デフォルトの名無しさん2016/06/21(火) 14:43:31.44ID:KqGcyocS
char同士の計算でもintにキャストされてた事あったなぁ。
0839デフォルトの名無しさん2016/06/21(火) 14:46:02.04ID:vVcY9+Oq
>>835
fast付きが最速だなんて誰が言った?

>>836
8ビットと64ビットでペナルティの違う環境とかいまどきあるのか?
0840デフォルトの名無しさん2016/06/21(火) 14:46:57.26ID:1Aiu31qu
>>835
その出力通りだとするとその環境の最速は8bitで次に速いのが64bitって事だと思うけど
0841デフォルトの名無しさん2016/06/21(火) 15:09:46.21ID:ScjYRl6x
>>839
C99の7.18を抜粋
- 少なくとも指定された幅をもつ最速整数型
(これらの型の幾つかは、同じ型を表してもよい)

実際ヘッダを見ると

typedef signed char int_fast8_t;
#if __WORDSIZE == 64
typedef long int int_fast16_t;
typedef long int int_fast32_t;
typedef long int int_fast64_t;
#else
typedef int int_fast16_t;
typedef int int_fast32_t;
__extension__
typedef long long int int_fast64_t;
#endif

となっていて既存の何らかの型を指していることがわかる
0842デフォルトの名無しさん2016/06/21(火) 15:46:57.65ID:vVcY9+Oq
>>841
脚注216読んだ?
0843デフォルトの名無しさん2016/06/21(火) 15:53:37.43ID:ScjYRl6x
>>842
least系とfast系で異なる型を選んでいるのだから根拠があるってことでしょ
0844デフォルトの名無しさん2016/06/21(火) 16:00:23.13ID:vVcY9+Oq
>>843
コンパイラ設計者の勘も根拠に入れるならね
0845デフォルトの名無しさん2016/06/21(火) 22:38:36.75ID:qCRCAI2Y
>>838
されてたことあった
というか
それがC言語の規格じゃねーの?
0846デフォルトの名無しさん2016/06/22(水) 09:57:39.86ID:es+zuR1i
基本的に整数拡張する。
0847デフォルトの名無しさん2016/06/22(水) 10:12:20.28ID:t1NluOvj
最速ったって別に一つとは限らないからな

>>839
> 8ビットと64ビットでペナルティの違う環境とかいまどきあるのか?

でっかい配列にアクセスするときなんかじゃ違うだろ
0848デフォルトの名無しさん2016/06/22(水) 11:10:19.06ID:WHe3DbmR
>>847
えー、配列まで考えたらleastが最速じゃん
0849デフォルトの名無しさん2016/06/22(水) 11:16:47.14ID:53iVaND1
外部シンボルが未解決
ってエラーが解決できなくて詰まってる…
0850デフォルトの名無しさん2016/06/22(水) 11:26:35.37ID:t1NluOvj
>>848
「ペナルティ」って限定しているんだから、フツー考えるのは配列なんかじゃないのか
キャッシュ関係以外であまりペナルティって言葉使わないだろ
0851デフォルトの名無しさん2016/06/22(水) 11:28:39.08ID:t1NluOvj
>>849
エスパーしてみよう

C++, C 混在か?
0852デフォルトの名無しさん2016/06/22(水) 11:35:33.25ID:cxBIgtwn
int *pt = &na
scanf(%d", pt);

scanf(%d", *pt);
上の書き方が正しいんだけど、下の「*」が付かないのはなんで?
0853デフォルトの名無しさん2016/06/22(水) 11:53:52.19ID:WHe3DbmR
>>852
scanfが格納する先をアドレス(ポインタ)で教えてやる必要があるから
0854デフォルトの名無しさん2016/06/22(水) 11:56:23.49ID:tA6VaAaS
>>852
・「na」と表記すれば「naの内容」、「&na」と表記すれば「naの場所」になる
・int *pt = &na;でptには「naの場所」が記憶される
・scanf()のパラメータ%dは、指定された「場所」に入力された数字を数値化して書き込む
・「pt」と表記すれば「ptの内容」、「&pt」と表記すれば「ptの場所」になる
・つまりscanf()に渡すべきなのは「naの場所」すなわち「ptの内容」にすべき
・scanf()呼び出しで「pt」の代わりに直接「&na」と書いてもよい

本題
・「*pt」と書くとアドレス解決をした結果、すなわち「naの内容」がscanf()に「場所」として渡ってしまうため、意図しない場所のメモリが書き換えられて誤動作する
0855デフォルトの名無しさん2016/06/22(水) 12:02:22.96ID:NlKUB6fm
ポインタ変数の定義に*を使うからややこしくなる。
0856デフォルトの名無しさん2016/06/22(水) 12:49:45.24ID:WHe3DbmR
>>855
*ptがintだと宣言しているのだから一貫している
0857デフォルトの名無しさん2016/06/22(水) 13:04:29.49ID:sEqYA8cS
>>849
初心者が必ずハマるのが
・使っているライブラリを指定し忘れてるか名前・場所指定が間違ってるか
・新しく作ったソースをプロジェクトに入れてないか

よくあるのが
・「環境変数や設定を書き換えろ」の説明書きを見落とし/無視してる
0858デフォルトの名無しさん2016/06/22(水) 13:30:22.89ID:PuXIjiSn
>>852
int *pt = &na;
は
int *pt;
pt = &na;

宣言のときの*はこれはポインタ変数ですよ、の*
式中で使うときは、その変数の名前で使う。
式中で*がついているときは、参照先の中身。

>>855 言ってるとおり、*に二重の意味があるので初学者は混乱する。
0859デフォルトの名無しさん2016/06/22(水) 13:42:38.14ID:pxlM+xuZ
本来の乗算の意味も含めて3重だな
cの発案者がどれだけエラい学者さんだろうが
これは愚かな決め事だったとしか言いようがない
@とか<-とかintptr_tとかあったはず
0860デフォルトの名無しさん2016/06/22(水) 13:56:30.99ID:3jrXtnQ0
トライグラフ用意するぐらいだし、記号は少なくしたかったんだろう
0861デフォルトの名無しさん2016/06/22(水) 14:35:19.45ID:tA6VaAaS
何か当初は、凄く貧弱な入力端末のサポートも考慮してたらしいからな
代替トークンとかあったし
ほとんどの奴は<% %>が{ }の代用になるとか覚えてないだろ
0862デフォルトの名無しさん2016/06/22(水) 14:39:44.36ID:U6GwwKeZ
小文字が扱えない端末だと無理
0863デフォルトの名無しさん2016/06/22(水) 15:00:20.34ID:DRbO5VgT
>>855
そういうことか
ポインタの何がわかりにくいのかさっぱりわからなかったんだ
0864デフォルトの名無しさん2016/06/22(水) 15:08:48.10ID:tA6VaAaS
(*********printf)("変態コード¥n");
最初見た時何の冗談かと思ったが
0865デフォルトの名無しさん2016/06/22(水) 18:51:46.90ID:7XAOBQ6z
>>861
> ほとんどの奴は<% %>が{ }の代用になるとか覚えてないだろ
てか、知らんかった
トライグラフは文字列まで変えてくれるから一度はまって ファ? ってなったわ w
0866デフォルトの名無しさん2016/06/22(水) 19:49:06.66ID:S4ISOPGK
そうそう、よく文字列で ?? と二つ書いて不具合?になる
0867デフォルトの名無しさん2016/06/22(水) 20:29:25.46ID:pxlM+xuZ
そんな古代との互換性なんてセキュア関数と同様に規格更新でさっさと切り捨てればいいのに
古代人のための開発環境は既に腐るほどあるわけで最新の規格で扱わなくても保守で困ることはあり得ない
そして過去の環境用に"これから新規開発する少数の変人"のために遺物を残しておくのは不利益の方が多い
0868デフォルトの名無しさん2016/06/22(水) 20:50:12.11ID:dtkzZf/t
むしろ誰も困ってないから放置されてるんだろう。
GCCもVCもデフォルトではトライグラフ無効だし。

ちなみにC++はC++17で削除予定。Cの規格は追っかけてないけど追従すると思うよ。
0869デフォルトの名無しさん2016/06/22(水) 21:21:35.14ID:pxlM+xuZ
昔話繋がりでもう一つ
符号修飾(signed unsigned)しない場合のデフォルトを符号有りにした理由は何なのだろう
そもそも正の値より負の値を扱う計算のほうが一般的に珍しくね?と思った
例えば10-5と10+(-5)は同じ結果を得るけど後者は加算器のみで可能とかそういう話かな
0870デフォルトの名無しさん2016/06/22(水) 21:44:18.74ID:X+fwM1CQ
大小を比較しやすい
unsigned int は、intと比較できない
for()で警告が出る
0871デフォルトの名無しさん2016/06/22(水) 21:45:12.70ID:X+fwM1CQ
ifとかforとかwhileとか
0872デフォルトの名無しさん2016/06/22(水) 22:09:22.60ID:sEqYA8cS
上限を追いたいなら大きい型を選べばいいわけで
0873デフォルトの名無しさん2016/06/22(水) 22:29:03.25ID:pxlM+xuZ
>>870-871
「デフォルトをunsignedと決めた場合」にもそれらの問題は起きるの?
同じタイミングで決めることなんだからunsigned同士なら警告いらないでしょ

>>872
ポインタも配列の要素数も負の値を取らないのにintをsignedにしちゃったもんだから
何も考えずに使う人が多くてsize_tとか作らなきゃいけなくなったんじゃないかと思ってさ
0874デフォルトの名無しさん2016/06/22(水) 22:46:24.05ID:hUvfpcAH
数学的に普通に考えたらsignedにしそうなもんだが。
0875デフォルトの名無しさん2016/06/22(水) 22:54:28.38ID:cYYCz91d
昔は符号の1bitさえ貴重だったからsignedとunsignedが出来ちゃったけど
整数型なんて本来signedだけでいいはずだしな
0876デフォルトの名無しさん2016/06/22(水) 23:12:26.36ID:pGQ5Vs/R
変数使って自由に計算したいと思えば
デフォルトで符号有りが妥当な考えだと思うけどな
0877デフォルトの名無しさん2016/06/22(水) 23:50:20.87ID:Qv152JkA
加算器で減算できる理に適った実装だと思うよ
加算の計算コストが一番安いから
0878デフォルトの名無しさん2016/06/23(木) 00:03:27.53ID:bf4RaDco
貧乏プログラミングをしたいがどんな環境を用意すればいいか分からん
0879デフォルトの名無しさん2016/06/23(木) 00:09:27.13ID:zQLdlEzo
>>878
MS-DOSが動くPC-9801と、MS-DOSで動作するCコンパイラを買え。
毎日の食事は卵かけご飯で決まり。
0880デフォルトの名無しさん2016/06/23(木) 00:19:41.35ID:tS35hTSk
>>878
ラズパイで
0881デフォルトの名無しさん2016/06/23(木) 00:19:54.21ID:Izcr7CYq
それ、今時だと VM で動かしそうだけど。
てか手元にあるな。Anex86 とか。w
0882デフォルトの名無しさん2016/06/23(木) 00:29:16.33ID:zQLdlEzo
MS-DOSは核ミサイルの発射にも使われているOSだから、よく研究すればアメリカ軍に雇ってもらえるかも試練
0883デフォルトの名無しさん2016/06/23(木) 00:40:21.23ID:zQLdlEzo
>>881
実機持ってるなら貧乏ちゃう
0884デフォルトの名無しさん2016/06/23(木) 00:41:19.32ID:zQLdlEzo
貧乏ならポケコンで我慢しいや
0885デフォルトの名無しさん2016/06/23(木) 00:57:51.20ID:QS3nj898
OSASKという狂ったOSをVMで動かして楽しむのが貧乏プログラミングのオススメ
0886デフォルトの名無しさん2016/06/23(木) 01:23:16.88ID:EI7DtIWp
>>878
Digital Mars C/C++ Compiler Version 8.57 (3662658 bytes) (NEW!)
Contains:

Win32 console versions of the tools
C and C++ compilers
http://www.digitalmars.com/download/freecompiler.html

バージョンは、8.52, 8.53, 8.57
どれがいいのかわからん
0887デフォルトの名無しさん2016/06/23(木) 01:25:51.66ID:EI7DtIWp
The open source, cross platform, free C, C++ and Fortran IDE.

Code::Blocks 16.01 is here!
Written by MortenMacFly
Thursday, 28 January 2016 10:21

Code::Blocks
http://www.codeblocks.org/
0888デフォルトの名無しさん2016/06/23(木) 05:57:26.88ID:woen2Xgd
>>878 の言う貧乏プログラミングが設備にかけるお金の話なら、
ジャンクノート買ってLinuxでも入れるのが安上がりかな。
仮想マシンを使えるなら追加投資なしでいけるのかもしれん。

富豪的プログラミングの反対の意味で貧乏ってことなら
MS-DOSが動く環境を用意してLSI-Cの試食版じゃないかな。
0889デフォルトの名無しさん2016/06/23(木) 09:15:39.13ID:B9t9g5hk
富豪的プログラミングの対義語だとすると、実行時の使用リソースの無駄を気にしないコーディングのことだが
0890デフォルトの名無しさん2016/06/23(木) 09:17:21.14ID:ja5rLTYk
はい?
0891デフォルトの名無しさん2016/06/23(木) 09:51:16.87ID:B9t9g5hk
逆だった
0892デフォルトの名無しさん2016/06/23(木) 10:24:23.38ID:ZQfpp6dv
>>886
10年以上前に終わってるツール勧めるな
0893デフォルトの名無しさん2016/06/23(木) 10:26:49.93ID:ZQfpp6dv
>>888
そりゃベジタリアンの間違いだろ
0894デフォルトの名無しさん2016/06/23(木) 12:50:41.20ID:woen2Xgd
「富豪的プログラミング」を誤解していたようだ。
単にメモリやらCPU速度をふんだんに使うこと、じゃないのね。
元々はユーザインターフェースに関する提言だったのか。

わざと利用可能な容量を制限する環境を作って省メモリを強要しても、
富豪的プログラミングの反対としての貧乏プログラミングにはならないな。

貧乏くさい(非力な)環境ということに訂正させてくれ。
よりリソースの制限を厳しくするならPICボードとかになるのかも知れんが。
0895デフォルトの名無しさん2016/06/23(木) 13:39:52.13ID:h9AvRner
手にはいるか分からんが、ワンダースワンの作成キットのワンダーウィッチがいい具合に貧弱
0896デフォルトの名無しさん2016/06/23(木) 15:32:50.69ID:tLxppfzL
>>884
最近のポケコンはCコンパイラ動くのか?
0897デフォルトの名無しさん2016/06/23(木) 16:31:51.23ID:woen2Xgd
シャープの学習用ポケコンにはCの動く機種があったけど、
現行機種ではないかも。あとインタープリタ方式だったかも知れぬ。
0898デフォルトの名無しさん2016/06/23(木) 17:07:27.02ID:bDeXs6rp
別に貧弱ハード揃えなくたって貧民プログラミングはできるだろう
ビットフィールド駆使したメモリマネージャ書いて数KBのメモリで全てやりくりするとか
考え方の問題だから
0899デフォルトの名無しさん2016/06/23(木) 19:00:04.78ID:GLhtmsq7
>>895
あー、買ったけど開封してないや。

x86 の tinymodelで作ればいいんじゃないかな?
0900デフォルトの名無しさん2016/06/23(木) 22:40:16.82ID:xBkC1ONT
富豪的プログラミングの対義語ならやっぱり「貧乏性プログラミング」かなぁ。
節約のためにはどんなに手間がかかってもいいみたいな。
0901デフォルトの名無しさん2016/06/24(金) 06:18:53.90ID:N/UhjoM3
>>884
ポケコンなんて高い物、貧乏人は買えない。
0902デフォルトの名無しさん2016/06/24(金) 07:04:47.89ID:fBO9F9sD
>>884
ポケコンなめんな
PC-1501 フルセット揃えたら 10万越えたし
0903デフォルトの名無しさん2016/06/24(金) 09:42:10.08ID:B5CtlbEH
おじいちゃん、その話昨日も聞いたよ
0904デフォルトの名無しさん2016/06/24(金) 10:02:57.16ID:k6zNHW44
時間課金制スパコンでプログラミング!
0905デフォルトの名無しさん2016/06/24(金) 12:41:58.93ID:5w3PkobH
昨日はそんな話してないのに
とうとう >>903 もボケはじめたのか...
0906デフォルトの名無しさん2016/06/24(金) 21:12:35.00ID:FIkQEcYv
PB-100こそ名機
0907デフォルトの名無しさん2016/06/24(金) 21:25:18.93ID:pDNM0BDJ
逆ポーランド入力な関数電卓があったっけかなぁ
0908デフォルトの名無しさん2016/06/24(金) 22:11:47.68ID:5w3PkobH
>>907
HP-35 かな
http://www.dentaku-museum.com/calc/calc/51-hp/hp/hp.html
レス数が900を超えています。1000を超えると表示できなくなるよ。