C言語なら俺に聞け 146

1デフォルトの名無しさん (ワッチョイ 839f-AnMQ)2018/04/30(月) 04:47:37.50ID:XX4FB8lc0
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/


C言語なら俺に聞け 144
https://mevius.5ch.net/test/read.cgi/tech/1514025223/

次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
-
※前スレ
C言語なら俺に聞け 145
http://mevius.5ch.net/test/read.cgi/tech/1519046038/
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

197デフォルトの名無しさん (ワッチョイ d680-vgbR)2018/06/01(金) 21:35:57.65ID:Hbp4Wjs80
C言語との関連を1行で述べよ

198デフォルトの名無しさん (ワッチョイ 1dbb-667V)2018/06/03(日) 16:23:01.05ID:i7wWwbyd0
void func(char *const restrict ary)
{
printf("%s\n",ary);

*(ary + 1) = '\0';

printf("%s\n",ary);

}

int main( int argc, char *argv[] )
{
char ary[] = "hoge";

func(ary);

return 0;
}

199デフォルトの名無しさん (ワッチョイ 1dbb-667V)2018/06/03(日) 16:24:38.29ID:i7wWwbyd0
このコードで配列の中身が書き換えられてしまうんですけどなぜですか?
constとrestrictの関係性がいまいちよくわかってないです・・・

200 ◆QZaw55cn4c (ワッチョイ da60-667V)2018/06/03(日) 17:12:43.28ID:5RsKIUxf0
>>198-199
const の位置が悪い
https://ideone.com/UOZ3RQ
ristrict は関係ない

スマホでポチポチ入力してたら既に書かれてるけど

>>198-199
とりあえずrestrictは無視するとして
>char *const ary
aryが定数。ary=0はコンパイルエラー。*ary=0はOK
>const char* aryまたは char const* ary
aryの参照先が定数。ary=0はOK、*ary=0はエラー

202デフォルトの名無しさん (ワッチョイ d59f-NLsb)2018/06/03(日) 17:23:51.40ID:m3SIxw/I0
>>198>>199
func() の中の *(any + 1) = '\0' がコンパイルエラーにならない理由は const が any に対するものであって
*any に対するものではないから。そのプログラムの場合 any そのものを変化させる any = NULL や any++
みたいな記述があるとエラーになる。

restrict はコンパイラの最適化に対するヒントで、そのポインタが別のポインタによって指されていないことを
前提とした最適化をして良いことをコンパイラに伝えるためのものだ。伝えられた側のコンパイラはそのような
最適化をやってもいいしやらなくても良い。

203 ◆QZaw55cn4c (ワッチョイ da60-667V)2018/06/03(日) 17:24:22.63ID:5RsKIUxf0
>>201
>スマホでポチポチ入力してたら既に書かれてるけど
どうして、書いている時点でそれがわかるのですか?高性能な専用ブラウザなんでしょうか

204デフォルトの名無しさん (ワッチョイ d59f-NLsb)2018/06/03(日) 17:25:19.52ID:m3SIxw/I0
うう。ゆっくり書いてたら間に二つも回答が・・・

205デフォルトの名無しさん (ワッチョイ 7aca-NLsb)2018/06/03(日) 17:29:03.88ID:xPBqnvux0
>>198-199
俺C言語詳しくない素人だけど、
ポインタに const 修飾子をつけるとき、
修飾子の位置によって定数化されるのが「ポインタ」か「ポインタの指す値」かが異なる。

char *const ary の場合はポインタ(アドレス)を書き換え不可。
++ary; は不可
*ary = 'A'; はOK

const char *ary の場合は値(文字列)を書き換え不可。
++ary; はOK
*ary = 'A'; は不可

restrict 修飾子は初めて見たけど、ググった限りは最適化に使うもので、
プログラムの意味は変わらないので無視してよかろう。

206デフォルトの名無しさん (ワッチョイ 7aca-NLsb)2018/06/03(日) 17:29:56.23ID:xPBqnvux0
>>204
俺なんかゆっくり書いてる間に回答が3つも…

207デフォルトの名無しさん (ワッチョイ 7aca-NLsb)2018/06/03(日) 17:32:22.37ID:xPBqnvux0
ポインタも値もどっちも書き換え不可にするには
const 型* const 変数名;
としないといけなそうだな。

208デフォルトの名無しさん (ワッチョイ d59f-NLsb)2018/06/03(日) 20:58:34.59ID:m3SIxw/I0
型 const * const 変数名; でも良い。

209デフォルトの名無しさん2018/06/03(日) 22:02:08.16
いつかどこかで見たこの流れ

*const 変数名
って書くより
変数名[ ]
って書く方が好き

211デフォルトの名無しさん (ワッチョイ 1a5e-msj4)2018/06/04(月) 19:56:59.58ID:/VyRep/C0
全然関係ないのを比べてるアホ

212 ◆QZaw55cn4c (ワッチョイ da60-667V)2018/06/04(月) 21:09:00.97ID:gbEnuF2j0
モノクロA4レーザープリンタが、値段も含めていい感じになっていますね…

213デフォルトの名無しさん (ワッチョイ d97f-m6Zz)2018/06/07(木) 23:22:34.08ID:69L/zpo00
>>205
>>206
でも一番わかりやすい!

まぁ、よく見る
const char **
の大半は意図した通りに機能してないよな
誰も中み書き換えないから表面化しないけど。。。

214 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/08(金) 00:03:38.43ID:+kkHvNSG0
>>213
const 修飾子を型指定より前にもってくる書き方は正直いってなじめないですよね

215 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/08(金) 00:06:11.65ID:+kkHvNSG0
関係ないけれども、今日から「民法」を勉強しはじめました、民法20条まで進みました
こういうのも新鮮でおもしろいなあ、と思いました

216デフォルトの名無しさん (ワッチョイ 131e-5NZz)2018/06/08(金) 05:45:49.36ID:524P9UER0
民法総則からキチンと基本原理を体型立ててやらないと理解できんぞ

217デフォルトの名無しさん (アウアウカー Sa2d-22KU)2018/06/08(金) 09:37:11.15ID:1PlqYTvda
そうか。じゃあ俺は拳法始めよう。

218デフォルトの名無しさん (ワッチョイ 198a-EqDK)2018/06/08(金) 17:49:04.15ID:rAAW+Mj80
>>215
2chのルールも覚えろよ、タコ

219 ◆QZaw55cn4c (ワッチョイ d360-EqDK)2018/06/09(土) 00:34:01.58ID:BV3WmSRm0
>>215
民法94条に到達して手が止まりました
これは難しい…条文は簡潔ですが判例が複雑怪奇でパターン抽出できないでいます

>>216
直に法文文面や判例にアタックしていますが弾き返されていますね…特に判例は裁判官の個性が見える気がします、当初考えていたほど「画一的」ではなかったのです

220デフォルトの名無しさん (ワッチョイ d3f9-5aY/)2018/06/09(土) 05:48:25.82ID:nuHHgQUg0
>>219
さあ、適切なスレに移動してそこで10年くらい引きこもっていようか。

配列の中身を一つずつ見て0じゃなかったら0にするみたいなプログラムがあります。

中身を見て代入するか分岐するのと、
投機的に0を代入する方法のどちらが速いのでしょうか

222デフォルトの名無しさん (JP 0H13-pn72)2018/06/21(木) 21:18:45.56ID:PKzn8umZH
推測するな、計測せよ

223デフォルトの名無しさん (ワッチョイ 7f81-GwbS)2018/06/21(木) 21:21:14.62ID:bCLvNhPr0
無条件に0代入する方がそりゃ速いだろう

224デフォルトの名無しさん (ワッチョイ 9fbd-yRyg)2018/06/21(木) 21:24:54.22ID:sKPxBIBt0
>>221
もちろん見ないほうが早い。
memsetで一気に0にするのが最速。

気になるなら測定しましょう。測定しない効率化なんてありえないよ。

それと、こいつを壁に飾っとくべし。
「プログラム最適化の第一法則:最適化するな」

225デフォルトの名無しさん (ワッチョイ ff0d-GwbS)2018/06/21(木) 21:46:17.50ID:KRXESqZV0
>>218
ここは5chだ ぼけ

226デフォルトの名無しさん (ワッチョイ 1f9f-6R0o)2018/06/21(木) 21:52:50.57ID:+L4M88hA0
最適化されたらどう書いても memset 使ったのと同じになるかも知れないけどな

227デフォルトの名無しさん (アウアウカー Sa93-tQU5)2018/06/21(木) 22:26:17.21ID:iolQTPDna
なんで開発要件も聞かないうちから見ないほうが速いに決まってるって言いきれるの?
0以外が入ってる可能性が低くて、書くより読むのが圧倒的に速いハードだったら責任取れんのかよ!

228デフォルトの名無しさん (ワッチョイ 1f9f-GwbS)2018/06/21(木) 22:39:37.01ID:+L4M88hA0
そんな特殊な環境なら最初からそう書いてくれない限りまともな回答はなくて当然

229デフォルトの名無しさん (ワッチョイ 9fe3-DJU/)2018/06/22(金) 00:33:00.46ID:Er730np30
DRAMは読み書き同じ速度だけど
MRAMとかは書くのが遅いんで
チェックして書くのを最低限にするのが常識になる時代が来るかも

230デフォルトの名無しさん (ワッチョイ 7fb3-MaHJ)2018/06/22(金) 00:53:38.92ID:/eT76nj20
>>227

>>224
> 気になるなら測定しましょう。測定しない効率化なんてありえないよ。

> それと、こいつを壁に飾っとくべし。
> 「プログラム最適化の第一法則:最適化するな」

231デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/22(金) 01:43:13.95ID:Hssdw/9K0
>>227
これおれも思った
圧倒的じゃなくても0率がたかくて書くのが遅ければそう
組み込みならメモリマップでメモリ以外のデバイスがつながってるかも知れないし

あとはコードがそうなってる可能性としては
0じゃない個数を数えるコードを入れやすいようにとか
SFRで書く命令が決まってるとか
キャッシュの関係でなるべく書きたくないとか

C言語スレだからな
組み込みの可能性も当然考えなければ

あと、
条件が整えばmemcpyより速いコードは作れる
アラインメントが事前にわかってるとか
SIMD命令が使える事がわかっているとか
DMAが有効とか

232デフォルトの名無しさん (ワッチョイ 1f9f-2Io7)2018/06/22(金) 02:00:59.03ID:F3L5fVz60
>>228
完全に同意

233デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/22(金) 02:54:33.68ID:Hssdw/9K0
経験の無さ自慢?
特殊なコードに対して特殊な状況を考えられないアホ自慢?

234デフォルトの名無しさん (ワッチョイ 1feb-vy4s)2018/06/22(金) 03:26:32.81ID:+fWpKJrf0

235デフォルトの名無しさん (ワッチョイ 1f50-ddCb)2018/06/22(金) 06:50:11.82ID:Hssdw/9K0
特殊な状況が考えられないアホ

236デフォルトの名無しさん (ワッチョイ 7f81-GwbS)2018/06/22(金) 09:18:53.30ID:xGEr9UFx0
暇だと盛り上がるな
そんなに仕事が無いのか

237デフォルトの名無しさん (アウアウカー Sa93-ndvs)2018/06/22(金) 09:40:17.18ID:TLETRHnoa
自分は特殊な状況を考えられる特別な人と思いたいんですね。わかります。

238デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 09:45:14.96ID:0px4TqJVd
普通の人
考えられないのはアホと言うだけの話

239デフォルトの名無しさん (アウアウカー Sa93-ndvs)2018/06/22(金) 10:10:27.57ID:TLETRHnoa
なんとしてでも自分以外をアホということにしておきたい。わかります。

240デフォルトの名無しさん (ワッチョイ 7f81-GwbS)2018/06/22(金) 10:39:59.24ID:xGEr9UFx0
特殊な環境でしか生きられないなら、そこから出てくるなよ

241デフォルトの名無しさん (ワッチョイ 9f8a-1M3p)2018/06/22(金) 10:54:33.90ID:VkaCaqwn0
実測が基本で、実測が出来ないなら
一般的な環境を想定してシンプルに記述するのが基本じゃないの

242デフォルトの名無しさん (ワッチョイ 1f61-DJU/)2018/06/22(金) 11:42:26.55ID:mMOSdCU40
Q.xxとxxどっちの書き方が速いですか?
A.環境依存

243デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 18:28:15.80ID:0px4TqJVd
まあ明らかな場合もあるけどね

特定の環境用コードなら実測が基本
でも仕事だと全てのパターンを実測してる暇は無い
そこでプロの勘を使う

244デフォルトの名無しさん (ワッチョイ 7ffe-GwbS)2018/06/22(金) 19:23:17.01ID:SPkT+A/00
大多数に当てはまるならそれでいい派 VS 1例でも当てはまらないならダメ派

245デフォルトの名無しさん (スップ Sd1f-ddCb)2018/06/22(金) 19:28:58.41ID:0px4TqJVd
特殊なコードに対して大多数とか

246デフォルトの名無しさん (ワッチョイ 7ffe-GwbS)2018/06/22(金) 19:40:06.51ID:SPkT+A/00
今回だけじゃないだろ。

「xxxでどうなんですか?」
「(基本的な環境では)xxxだよ」
「いや、xxxxという稀な環境だと当てはまらないからそれは間違いだ!!」

しょっちゅう見かけるわ。

命名

 特殊厨

新着レスの表示
レスを投稿する