X



C言語なら俺に聞け 150

レス数が900を超えています。1000を超えると表示できなくなるよ。
1デフォルトの名無しさん (アウアウクー MM57-IE4z)
垢版 |
2019/02/06(水) 13:39:03.21ID:c4bnQMl3M

次スレを作る時は上記1行をコピーして2行に増やして必ず1行目に入るようにしてください。

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言語なら俺に聞け 149
https://mevius.5ch.net/test/read.cgi/tech/1540731704/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/03/18(月) 15:56:04.05ID:YfgH0B4l0
>>804
数字 ('0'〜'9') に対応する文字コードが連続する保証は有る。
2019/03/18(月) 16:33:31.22ID:CWr9PpIQ0
'0' 〜 '9' で挟んで '0' で引き算するのは保障されてるので成立するけど
'a' 〜 'f' , 'A' 〜 'F' で挟んで - 'a' + 10 や - 'A' + 10 は保障外のコードになる と。
2019/03/18(月) 17:09:05.92ID:yKiI4G/I0
>>801
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ

先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
2019/03/18(月) 17:42:10.10ID:mCQ8i9jz0
>>807
「処理系が必ず定義しなければならない」
「純粋に処理系依存なので、規格としては何も触れない」

この違いがイマイチ良く分からんのですが
2019/03/18(月) 17:56:16.31ID:1YRHAy75a
>>803
ないです
都度確認すればいい
2019/03/18(月) 21:11:30.38ID:yKiI4G/I0
>>808

> 「処理系が必ず定義しなければならない」
それが処理系定義
たとえば sizeof(int) が返す値だ

> 「純粋に処理系依存なので、規格としては何も触れない」
これは未規定
たとえば printf("%d %d", getchar(), getchar()); の場合の左右の getchar の実行順序だ

わかってないんなら、ちゃんと規格票で確認しとけ
2019/03/18(月) 23:08:12.32ID:wuyTgyGr0
>>795,801 ポインタの表現形式とは関係なく、未定義の動作になります。
https://www.jpcert.or.jp/sc-rules/c-fio47-c.html

実際の処理系での挙動を説明しようとするとポインタの表現形式で説明が付く
ことが多いだろうとは思います。
2019/03/18(月) 23:15:18.00ID:5t+N6Jn90
C11 7.21.6.1.9で「変換指定子が不正である場合の動作は未定義」ってあるね
処理系定義は%pの時のポインタの値の表現形式と間違えてないか
2019/03/18(月) 23:23:41.88ID:wuyTgyGr0
>>810
規格で「何も」触れられていないのは未定義 (undefined) なのでは?
禁止を破るほか、規格に定めのないところの動作も含まれます。

規格で示される選択肢のうちのどれを処理系が選ぶかが定められておらず
処理系任せ(文書化も不要)なのが未規定 (unspecified) かと。
2019/03/19(火) 08:12:11.66ID:qtB10olYM
自分はc言語とc#(pcツール開発用途)使うけど、
c言語は仕様がコンパクトで、このスレのような議論があって面白いな。
c#はライブラリが充実してて凄く便利
2019/03/19(火) 09:23:10.29ID:LKFNCpsT0
>>813
嘘つくんじゃねえ
規格で触れられていない事項は未規定だ
未定義は「知るかボケてめーが悪いんだろうが」という意味の用語だ
2019/03/19(火) 10:26:28.12ID:gyYe55lf0
>>815
http://kikakurui.com/x3/X3010-2003-01.html#9
> この規格の制約以外の箇所で現れる…(し)なければならない又は…(し)てはならないという要求をプログラムが守っていない場合,その動作は未定義とする。
> この規格では,このほかに,用語 未定義の動作を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> これらの三つの書き方は強調度において何ら変わりはなく,それらはすべて未定義の動作を規定する。
2019/03/19(火) 11:35:26.58ID:71/TIYaC0
未定義な動作っていうのはプログラムが未定義な動作をするわけじゃなくて
コンパイラー製作者が決める動作が未定義だから好きなように動作を決めれるってことだぞ
2019/03/19(火) 11:43:35.24ID:LKFNCpsT0
>>816
こちらの指摘を認めたんだな?
2019/03/19(火) 12:40:50.73ID:/V+FXtnWM
ID:LKFNCpsT0は言語仕様の前に日本語を勉強すべき

> 動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
2019/03/19(火) 13:28:08.89ID:LKFNCpsT0
>>819
未定義とは何かの本文は「3.4.3 未定義の動作(undefined behavior)」だ
おまえが出してきているのを、この本文に対する補足説明と理解して読み直してみろ
2019/03/19(火) 17:11:50.12ID:qa7ql0+P0
>>816
> 未定義の動作を示すこともある

https://www.jpcert.or.jp/sc-rules/c-msc15-c.html
http://www.c-lang.org/detail/undefined_behavior.html

「この辺読んでおけ」ってかんじですか
2019/03/19(火) 17:56:13.66ID:CsLrwzwwd
>>815
JIS X 3010:2003 3.4.3
未規定の動作(unspecified behavior) この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。

C11 3.4.4
未規定動作
不特定の値の使用、あるいは当国際標準が提示する2つかそれ以上の可能性があり、いずれを選ぶかに関してそれ以上の要求を課さないその他の動作。

一応選択肢は与えてるように見えるな
2019/03/19(火) 18:02:59.01ID:LKFNCpsT0
「異常なプログラム」、「正しくないプログラム」、「正しくないデータ」

このへんのキーワードが、なぜ「未定義の動作」という用語をわざわざ作っているのかの存在意義だ
他の「処理系定義の動作」や「未規定の動作」と見比べてみな
「未定義」だけ異質な点はただ1つ
2019/03/19(火) 19:53:17.00ID:/V+FXtnWM
>>820
あほか、そこに「正しくないプログラム構成要素」って書いてあるだろ
規格には正しいプログラムの定義は書いてある
書いてないことは全て正しくないプログラムだよ
そもそも全ての未定義を定義できるわけないことぐらいはアホでもわかるだろw
2019/03/19(火) 20:49:49.43ID:M/rPqWkP0
CとC++のことで少しはまったことがあったので質問です。
はまった部分を単純化して例を挙げます。

1.単純化した例
FuncC.c
#include <stdio.h>

void Func(void) { puts("FuncC"); }

FuncCpp.cpp
#include <stdio.h>

void Func(void) { puts("FuncCpp"); }

main.c
void Func(void);

int main(void) { Func(); return 0; }

上記3つのファイルを gcc *.c *.cpp でコンパイルリンクするとFuncC.cのFuncが呼ばれます。
main.cをmain.cppに名前を変更して同じことをするとFuncCpp.cppのFuncが呼ばれます。
clでも試しましたが同じ結果です。

2.はまったこと
拡張子によって呼ばれる関数が違うことに気づかず延々と的外れなことをやっていた。

3.知りたいこと
1の結果がなぜそうなるのかちゃんとは分かっていません。
なぜそうなるのか分かるサイト等あれば教えてもらえませんか?
826デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 20:58:40.16ID:BI7+7Q7/a
>>825
C++ は extern "C" {} のブロック内にC言語書かないと駄目なんじゃなかったっけ?
で、C++って同じ関数名で引数の違う関数作れるよね。だからCと見た目そっくりでも作られるコードが少し違うんじゃないの?
2019/03/19(火) 21:04:51.38ID:Dro8a+Ew0
Cは関数名がそのままシンボル名になるけど
C++のほうは関数名に引数の型情報が付加されたmanglingされたシンボル名となるので
リンカーでリンケージする際に区別してる
C++ から C 関数を呼ぶには 明示的に extern "C" と宣言されてないとその機構を突破できない


んじゃなかったかな
2019/03/19(火) 21:13:55.37ID:45LJYysD0
>>825
c++ から c の関数を呼ぶのなら extern "C"
829デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/19(火) 21:14:21.98ID:BI7+7Q7/a
おお。多分そうだ。
あとはもっと詳しい人に任せた。
2019/03/19(火) 21:17:38.17ID:45LJYysD0
途中で投げてしまった
私がはまったのは、win32api で、 ::RegisterClass() にて登録する WindowProc を extern "C" しなかったために、凄く困った記憶があります
2019/03/19(火) 21:45:25.26ID:zmaQJWrD0
>>825
main()からcallされるasm用関数名が違うのでは

FuncC.c func() ---> funcC()
FuncCpp.cpp func() --> _Z4Funcv()
main.c call func() ---> call func()
main.cpp : call func() --> call _Z4Funcv()
2019/03/19(火) 22:56:54.72ID:ieOLeRQla
まんぐり
833デフォルトの名無しさん (ワッチョイ 6f02-B/CD)
垢版 |
2019/03/19(火) 23:56:04.61ID:ni3gZ2OF0
>>825
これ読めばわかるかな。
https://www.wagavulin.jp/entry/2017/02/09/215036
2019/03/20(水) 05:59:53.51ID:Jx7dUCON0
>>824
規格では正しくないプログラムをill-formedという
つまり正しくないプログラムも記載されているということだ

別に規格に限ったことではない
あるものが何であって何でないという境界を明確化するのは
ごく当たり前のものの書き方だ
2019/03/20(水) 06:44:57.57ID:nNN3jHgVM
>>834
> あるものが何であって何でないという境界を明確化するのは
すでに明確だろ?
「正しいプログラムでないプログラム」は「正しくないプログラム」
正しいプログラムの定義は書いてあるから境界はすでに明確だよ
ill-formedとかの名前がどうのこうのは関係ない
2019/03/20(水) 06:54:48.64ID:Jx7dUCON0
>>835
もうやめろ見苦しいから
2019/03/20(水) 07:09:56.04ID:nNN3jHgVM
>>836
見苦しいのは>>834だろ
なんのためにill-formedとか言い出したんだ? w
2019/03/20(水) 07:25:49.13ID:Jx7dUCON0
どっちが見苦しいか他の連中に聞いてみな
2019/03/20(水) 08:12:13.89ID:SCVZEQpp0
「未定義」と「不定」については Phinloda さんの↓も分かりやすいね。
少々古いのが難だけど、内容は今でも正しいと思う。

初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html


ところで、「不定の動作」であるが「未定義ではない」、
しかも「不定であることの影響をユーザが見ることができる」
コードの例って何かあるだろうか。
ちょいと考えてみたけど、不定の影響を見るために何かすると
そのせいで未定義の領域に突入しちゃうんだよ。
2019/03/20(水) 08:12:56.46ID:nNN3jHgVM
>>838
どう見てもお前だろ
そもそも内容についてレスできないなら黙ってなよw
2019/03/20(水) 09:01:05.62ID:xVgsTWI1M
>>839
少し前に誰かが書いてた関数の引数の評価順序とか
2019/03/20(水) 09:38:01.32ID:Jx7dUCON0
>>840
推測してんなよ
第三者に聞く勇気がねえの見え見えだぜw
2019/03/20(水) 10:13:53.38ID:nNN3jHgVM
>>839
foo(), bar()でなんか画面に出力するとかして
その例にある
a = foo() + bar();
でいいんじゃね?
2019/03/20(水) 10:14:13.87ID:nNN3jHgVM
>>842
はいはい、一人で吠えてろよw
2019/03/20(水) 10:40:40.56ID:3Av4Lhjq0
>>839には未定義は間違いと書いてあるけどそれは間違いで
未定義が間違いか間違いじゃないかを決めるのも未定義だから
未定義が間違いというのも間違いなんだよな
2019/03/20(水) 10:45:39.91ID:L8bJW9Z40
未定義たぁ不定野郎だ
2019/03/20(水) 12:24:13.19ID:nNN3jHgVM
>>845
そういう話をしたいならまずは君の言う「間違い」とやらをきちんと定義してくれ
2019/03/20(水) 12:34:48.75ID:3Av4Lhjq0
そもそも間違いを定義したくないから未定義にしたんだから定義できるわけないよな
849デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
垢版 |
2019/03/20(水) 12:48:55.48ID:OxEz5Koua
[翻訳]あなたがプログラミングに向いていない10のサイン - Qiita
https://qiita.com/hareku/items/4bfc48e23e83e0d300f3

1 好奇心の欠如
2 自律性と機知の欠如
3 問題に直面しても粘り強さが無い
4 問題解決に成功した気持ちはない
5 学習と理解に焦る
6 思考に飽きたり疲れたりする
7 自分のことを考えられない
8 堅く、狭く、そして無秩序な考え
9 複数の答えの間の「良い」と「悪い」の連続性に気付かず、「正しい」答えを望んでいる
10 細部に注意を払っていない
2019/03/20(水) 15:33:42.99ID:Jx7dUCON0
>>847
何が間違いか、はっきり丁寧に説明してやっても
結局、自らの間違いを認める潔さを絶望的に欠いていて
まったく話にならない痛いやつであることを
ここの連中は目の当たりにしたばかりなんだが
2019/03/20(水) 15:42:05.78ID:3Av4Lhjq0
>>850>>849の9番のサインがあるからログラミングにむいてないな
2019/03/20(水) 15:53:53.83ID:knvp6QUa0
ワロタw
2019/03/20(水) 15:57:42.67ID:+9jdpzuGx
>>851
>ログラミング
10番のサインあり。
2019/03/20(水) 16:28:25.34ID:Jx7dUCON0
ブーメランぶっ刺さってやんのwww
2019/03/20(水) 16:36:56.04ID:Jx7dUCON0
日本語を勉強すべきだの、あほかだのと、無礼な態度は若気の至りと
こちらは目を瞑って色々と箇条番号やらキーワードやら出してやってたが
そろそろ見限る頃だな
2019/03/20(水) 16:44:53.17ID:fwuhbGCo0
暇でないなら、直ちに見限るべき
2019/03/20(水) 17:24:29.94ID:SCVZEQpp0
>>841 >>843 (少々長くなった、読みにくくてすまぬ)
2つの関数があって、それらを「同時に」使う式で評価順が不定、
しかも未定義ではない、というのは分かるんだ。

int foo(void) {return 1;}
int bar(void) {return 2;}
func(foo(), bar()); // 関数引数の foo(), bar() どちらが先に呼ばれる?
int a = foo() + bar(); // 式中の foo(), bar() どちらが先に呼ばれる?
・どちらが先に呼ばれても同じ結果が得られる(後者では a の値は 3 になる)
・どちらが先に呼ばれたかをユーザが知ることは不可能

ところが、呼ばれた瞬間を捕まえてやろうと、関数に仕掛けを施すと…
int foo(void) {printf("foo()\n"); return 1;}
int bar(void) {printf("bar()\n"); return 2;}
「二つの副作用完了点の間に、オブジェクトの値を2回以上変更」という、
未定義の動作になっちゃうんだよ(俺はここで勘違いをしてるのだろうか?)。
printf() の内部状態もオブジェクトだろうからね。出力バッファとか。
・どちらが先に呼ばれるか表示される、おそらく結果は同じ(a == 3)だろう
・しかし、このプログラムには未定義の動作が含まれている


実際問題としては printf() を差し込んでも動作が変わらないように
うまくライブラリが作られてると思うけどね。
この投稿の趣旨は、「不定の動作であっても、結果を使うだけなら
プログラムとして正しい。しかし、不定の動作の内実を探ろうとすると、
その活動によって未定義動作を含んだプログラムになってしまう」っていう
不確定性原理みたいな何かが規格に仕込まれてるんじゃないか、という疑い。
(別に陰謀論をブチ上げようって意図はないので安心してくれ)
2019/03/20(水) 17:44:50.88ID:Jx7dUCON0
>>857
そのコードが未定義かどうかは達成しようとしている目的による

たとえば、こういう場合
int x = 0;
int foo(void) { return ++x; }
int bar(void) { return ++x; }
int main(void)
{
int y = foo() - bar();
assert(y == -1);
}
fooとbarの実行順序に依存すると
実行順序は未規定だが、未規定に依存することは禁止で、
その禁止を破ったせいでmainの動作が未定義となる

これに対して、
int foo(void) {return 1;}
int bar(void) {return 2;}
int main(void)
{
int y = foo() - bar();
assert(y == -1);
}
この例では未規定の動作を含むが
その未規定がどう転んでも影響がない、
つまり依存していないので未定義の動作とはならない
2019/03/20(水) 17:46:07.38ID:Jx7dUCON0
というわけで、printfで実行順序を見てやろうという目的なら
どちらが先でも、その目的が達成できるので未定義の動作ではない
2019/03/20(水) 17:52:06.04ID:11QE5ZAQ0
>>857
printf(..., printf(), printf()); こういうのとは違って
仕込んだ printf() の完了点はあくまで文末の; であって
printf() の内部状態変遷による未定義は踏まずに済むような気がする
2019/03/20(水) 18:12:44.03ID:K9L8gFp50
>>859
いや、 >>857 が言ってるのは、
printf の中のバッファなどの状態管理で同一の変数を破壊しないって保証ある?
ってことだと思うんだが。
2019/03/20(水) 18:13:55.67ID:xQ4G2GlCd
毎度だけど話がズレるんだよな
>>810に対して>>813で「規格内で触れられてないのは未規定じゃなくて未定義じゃね?」って物言いがついた(未規定の動作は>>822
で、>>816が「規格内で触れられてない場合も未定義」って言おうとしたんでしょ
>>823でなぜか未定義動作は異常(不正)なプログラム云々言い出したので話が分からなくなったんでは?
2019/03/20(水) 18:18:36.19ID:fE2Kl8w7d
冷静な議論ならともかく、レスバ状態になると各々有利な立場になろうとしてだんだんと話が逸れてくんだよな。
2019/03/20(水) 18:27:17.55ID:Or7antuS0
「レスバ状態」というのは「レスバトル状態」の意味ということでよろしいか
20世紀の「レスって何」を思い出すが…
2019/03/20(水) 18:30:12.38ID:fE2Kl8w7d
>>864
yes
2019/03/20(水) 18:35:51.85ID:nNN3jHgVM
>>857
2回以上変更しなきゃいいんなら
int i=0;
int a[2]={0,0};
int foo(void){i=1; return 0;}
int bar(void){a[i]=1; return 0;}
でいいんじゃね?
a[0]=0; a[1]=1; ならfoo() ⇒ bar()
a[0]=1; a[1]=0; ならbar() ⇒ foo()
の順
2019/03/20(水) 19:15:28.64ID:Jx7dUCON0
>>861
printfが持つ状態って具体的に何だ?
妄想しだすとisdigitみたいのまで状態を持つことを考慮せねばならんのだが
2019/03/20(水) 19:18:49.33ID:SCVZEQpp0
>>857>>861 の意味で書いた(前半部分が余計だったのかも)。
最初の4行のコード foo(), bar() に printf() が仕込まれてない方は
「不定」だが「未定義ではない」。

ところが後半 printf() を仕込んだ方は >>858 の出してくれた最初の例、
foo() と bar() が同一のグローバル変数を変更する場合と
本質的に同一の、つまり未定義動作じゃないか、という話。


>>866 これは巧妙だし、思いつかなかった。
考えてみる(調べてみる)ので少々時間をくれ。
2019/03/20(水) 19:22:36.34ID:TUtYbyGsM
>>867
端末になにか表示されている、ファイルに文字が追記されている、というのが「状態」だよ。
2019/03/20(水) 19:25:59.48ID:nNN3jHgVM
>>868
ID:Jx7dUCON0はスルーでいいよ
レスの内容が頓珍漢すぎる
2019/03/20(水) 19:39:28.59ID:Jx7dUCON0
>>869
つまりstdioさらにはデバドラがRENTかREUSかって問題ということで
じゃあ別プロセスでprintfを使われたら未定義動作ならHello worldすらill-formedって話だな
2019/03/20(水) 21:01:55.22ID:SCVZEQpp0
>>866 の案も未定義な感じ。

EXP30-C. 副作用が発生する式の評価順序に依存しない
ttps://www.jpcert.or.jp/sc-rules/c-exp30-c.html

本文冒頭の引用部 (ISO/IEC 9899:2011 セクション 6.5 らしい) より再引用
> スカラオブジェクトへの副作用が、このオブジェクトへの別の副作用、
> または、このオブジェクトの値を使った演算、のいずれかに対して
> 順序が規定されていない場合、未定義の動作となる。

foo() の i=1; が「スカラオブジェクト i への副作用(代入)」
bar() の a[i]=1; が「このオブジェクト i の値を使った演算(配列の添字)」
に該当するかと。


ちなみに前述の Phinloda さんのページだと【未定義の例】にある
二つの副作用完了点の間に、オブジェクトの値を2回以上変更している場合、
 又は変更した後で新しい値を得ること以外の目的でそのオブジェクトを
 アクセスしている場合。
の部分と思われるが、ちょいと分かりにくいね。
…いや、自分で紹介しといて、その言い草はないだろ、と我ながら思うけど。
2019/03/20(水) 21:33:10.02ID:SCVZEQpp0
>>867 返答が前後して失礼。
printf() が持つ(かもしれない)状態ってのは、例えば
出力バッファ(fflush() で強制的に吐き出させるアレ)の
使用量を管理するカウンタかポインタか、そのあたりを考えてた。
もちろん stdout のバッファリングを禁止すれば、この場合に
printf() を安全に使えると考えてるわけでもないのだけど。

むしろ「不定の評価順序を調べるのに printf() を使えるなら、もっと簡単で
末端プログラマに読めるソースコードで実現できるんじゃないか」って感じ。
ライブラリ関数だと、中で実際に何をやってるか見えないからね。


>>849 の 3, 6 あたりに該当してきたので、本日はここまで。
…というか「バーナム効果」って奴じゃないの?
2019/03/20(水) 22:01:51.83ID:XMH8sO2j0
>>872
> bar() の a[i]=1; が「このオブジェクト i の値を使った演算(配列の添字)」
> に該当するかと。
なるほど
よくよく考えたらそのリンク先の未規定の例を参考にして
int i=0;
int foo(void){i=1; return 0;}
int bar(void){i=2; return 0;}
でいいと思う
2019/03/20(水) 22:13:24.28ID:47yan6gC0
なにやら話がややこしい方向に行ってるけど、
そもそも関数の呼び出しは副作用完了点だぞ?
876デフォルトの名無しさん (アウアウエー Sac2-v7M6)
垢版 |
2019/03/21(木) 10:46:08.11ID:Jl2vA9O/a
C言語初心者です。
やっとポインタの学習にさしかかったところです。
C言語におけるポインタという概念と、
メモリの間接アドレス指定とは似ていると思ったのですが、
この感覚は間違っていますか?
2019/03/21(木) 10:57:18.81ID:BSODtxQx0
間違ってないです
2019/03/21(木) 12:29:28.54ID:hA8AO9It0
>>876
いいセンスです
2019/03/21(木) 12:35:12.10ID:QKEEZEuZ0
ポインタの理解の前にメモリ間接アドレス指定をご存じな人ってすごいw
2019/03/21(木) 12:42:31.97ID:A52ypKFV0
>>879
ベーシック、アセンブラの順にやってきたら
だいたい理解はできているもんじゃないの?
2019/03/21(木) 12:56:03.12ID:0TbsGGEWd
今どきその順番で始める初学者がどれだけいるのかね
2019/03/21(木) 13:15:33.98ID:y6QadYkWa
>>877
>>878
恐縮です
学習の中でつまずいたらまた質問させてください

>>879
>>880
間接アドレス指定のほか直接・相対・即値…などは
基本情報技術者試験の勉強範囲になっているので知りました
C言語もきっかけは基本情報の対策として取り掛かったものです
残念ながらBasicもアセンブラも手付かずです
2019/03/21(木) 14:04:09.43ID:u3ljjJr7a
まだCASLとかあんの?
2019/03/21(木) 16:01:46.89ID:hWT+U/v40
>>883
おいおい

https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_hanni_skill.html#yougo
https://www.jitec.ipa.go.jp/1_13download/shiken_yougo_ver3_1.pdf

探すのに2分掛からなかったぞ…
2019/03/23(土) 02:49:51.66ID:OxlPANCja
セミコロン2つ並ぶのってどういう意味でしょ?最初は誤植かとおもいましたが

for(i = n;;){ ←ここ
if(strcmp(hogehogehogehogehoge
2019/03/23(土) 03:00:16.33ID:lRnozO4Da
for のかっこの中は二個あるじゃん、いつも
2019/03/23(土) 03:14:04.86ID:0Wp5e8jo0
>>885 で for ループを使う必然性って何だろう
while でも良いように見える
2019/03/23(土) 06:01:58.96ID:fQCcwCLn0
>>887
while (1) {
は warning が出るコンパイラもありますので
for (;;) {
を多用しています…
2019/03/23(土) 06:17:45.22ID:jegHMgvE0
確かに for (i = n;;) /* 初期化あり, 継続条件なし, 更新なし */ よりは
i = n; // 初期化
for (;;) // 無限ループ, 終了判定はループ内
の方が for の使い方では見慣れた書き方だよな。

というか for (i = n;;) を見せられたら、いったん立ち止まって
頭の中で2行分けに翻訳して理解すると思うわ。
2019/03/23(土) 06:25:51.88ID:2BzPzaMr0
while(1) に難癖つけてくるコンパイラって具体的に何だ?
2019/03/23(土) 06:42:04.57ID:WDi4jE890
HPUXだった気がす
2019/03/23(土) 07:22:12.89ID:0Wp5e8jo0
https://www.sejuku.net/blog/25197#continue



if(i + 1 < 3) {

と書かれていて i < 2 でないのは何故でしょうか
先進的なコンパイラだと自動的に最適化されるものなのでしょうか
2019/03/23(土) 07:38:42.49ID:lQ0YIRmF0
while (1 == 1)
2019/03/23(土) 08:03:50.35ID:jegHMgvE0
>>892
実行結果を見ると、最初に表示されるのは「3回目の処理です」だね。
この 3 はループ変数 i から算出される値。

最初に表示したい値である 3 を if の条件式の中にも書いておく方が
プログラムが何をやってるか(3を表示する状態になるまで continue する)を
読み取りやすいという考え方かと。
if (i < 2) を見て「i < 2 の間は continue される。i == 2 になったら
continue されずに下の処理に進む。すると最初に表示される数字は i + 1 で 3」
と理解するより簡単だろう(とプログラムを書いた人が考えたのだろう)。


実験したところ、ちゃんと最適化されるみたいね。
if (i + 1 < 3) でも、アセンブリの方では 2 との比較になってた。
2019/03/23(土) 08:08:46.89ID:2BzPzaMr0
>>891
情報ありがとう
希ガスってことは昔の話だよな
2019/03/23(土) 08:09:19.77ID:2BzPzaMr0
>>893
それを言うなら while(!0) だろ
2019/03/23(土) 08:16:45.51ID:hkiXoQ0jd
everlasting的な英単語を1でdefineしてwhileに突っ込んで無限ループ作ってるコードなら見たことある
却って分かりにくかった
2019/03/23(土) 08:20:29.61ID:3KsHUf0Y0
>>897
悪いなのび太、それ単体試験用のマクロなんだ
2019/03/23(土) 08:30:38.60ID:2BzPzaMr0
#define forever while(1)
これでええやん
2019/03/23(土) 14:07:37.70ID:OxlPANCja
知りたいことが答えてもらえないが文脈からさっすると
for(i = n;;)は ;; こいつが無限ループさせる whileのときの (1)みたいなもんなんかな
そうなると i = n って表記は i が nといっしょやったらずっと無限ループしとけってことになるんかな
んーそうう考えると for(;;)だったら無条件でループやっとけって感じでつかえそうだけど i = nならとかなんか条件はいるなら ;; こんなん
つかわんでももっと他になかったんじゃろかと思うな。 しかしこのテキスト何の説明もなくいきなりあんな技使いやがってやぶりすてたろか
901デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/23(土) 14:23:08.16ID:Bvojjkpo0
>>900
for 分のカッコ内は必ずセミコロンが2つ必要で、最初の項目は変数の初期化、2番目の項目は終了条件、
3番目の項目はブロックの最後に実行させる(主に変数をインクリメントしたりデクリメントしたりする)処理だ。
この項目が抜けていた場合はその処理に関して何もしない。例えば2番目の項目が抜けていたら終了条件なし
(つまり無限ループ)になる。

まあ入門書見ればわかると思うが、これの置き換えだ。

i = 1;
while (i < 3) {
 /* 何かの処理 */
 i++;
}



for (i = 1; i < 3; i++) {
 /* 何かの処理 */
}

特別なのは終了条件が空の場合は終了させなくなる事だけ。
902デフォルトの名無しさん (ワッチョイ c602-rXtv)
垢版 |
2019/03/23(土) 14:23:33.00ID:Bvojjkpo0
for 分じゃない for 文だ。
2019/03/23(土) 15:44:48.19ID:jegHMgvE0
>>900
すまんね。>>885 の質問を見て、普通の for の使い方、つまり
for (初期化; 継続条件; 再初期化) は理解してると感じたのだ。
その辺の説明は >>901 を見てもらうとして、ちょっと気になった点。

for (i = n;;) の i = n は「i が n に等しければ…」ではなく、
「i に n の値を代入する」だよ。等しいかの判定には == (イコール2個)を使う。
for の普通の使い方では「ループ制御変数 i の値を n に初期化」ということ。


代入の = (イコール1個)と、等値判定の == (イコール2個)は、
携帯端末で見分けにくかったりするのかな。
自分では新式の装置を使わないので、そういう部分に思い至らなくてな。
2019/03/23(土) 16:17:36.63ID:dHpVxeMm0
お願いします。OSはcentos7です

メルセンヌツイスタを使って、ひとつだけ乱数を出したいのですが
乱数を出す間隔が非常に狭く、以下の関数でtime(NULL)を用いると
同じ乱数ばっかり出てきてしまいます。

※関数はコレを使ってます
http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html

たとえば、1回関数を実行して、ひとつ乱数を生成。
それを、秒間20や、30繰り返したとしても異なる乱数が出てくる方法ってありませんでしょうか

勝手なお願いですが、できる限り簡単な方法でお願いします。
VBAでパチンコシミュレーターを作ったのですが、
実行速度が非常に遅く、もっと高速化するためにCの勉強を始めたばっかりです
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況