↑
次スレを作る時は上記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
探検
C言語なら俺に聞け 150
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウクー MM57-IE4z)
2019/02/06(水) 13:39:03.21ID:c4bnQMl3M760デフォルトの名無しさん (ワッチョイ 738f-kbMb)
2019/03/16(土) 19:25:45.05ID:QzqNYN9X0 >>758
ソースを何らかの方法で PNG なり JPEG なり GIF なり
ソースを何らかの方法で PNG なり JPEG なり GIF なり
761デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/17(日) 00:34:59.62ID:dzL2D1Cha Cはじめましたよろしくです。これみてやってください
FILE *fp;
char *p;
char fname[100];
char str[500];
gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);
while(p != NULL){
printf("%s", str);
p = fgets(str, 500, fp);
}
とやって難なくファイル表示してくれましたが、これpはしょれんじゃね?と思ってこうしてみましたの
gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp); とりあえず放置
while(str != NULL){ p→strに書き換え
printf("%s", str);
//p = fgets(str, 500, fp); コメ停止
fgets(str, 500, fp); こうしてみた
}
すると
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・っと無限に続いて
FILE *fp;
char *p;
char fname[100];
char str[500];
gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp);
while(p != NULL){
printf("%s", str);
p = fgets(str, 500, fp);
}
とやって難なくファイル表示してくれましたが、これpはしょれんじゃね?と思ってこうしてみましたの
gets(fname);
fp = fopen(fname, "r");
p = fgets(str, 500, fp); とりあえず放置
while(str != NULL){ p→strに書き換え
printf("%s", str);
//p = fgets(str, 500, fp); コメ停止
fgets(str, 500, fp); こうしてみた
}
すると
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・っと無限に続いて
762デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/17(日) 00:35:16.47ID:dzL2D1Cha なんで止まらないんでしょ?
763はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 00:37:54.05ID:aA4z/LNt0764デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/17(日) 00:43:34.56ID:dzL2D1Cha >>763
もすこしだけおしえてください
fgetがfpに指定したというか登録したファイルから指定数読み込んで、それをpに渡して…
このときに文字終端ならpにNULLも渡ってそれでwhileの条件に合致して止まると思いまして ←ここまであってますか?
なら、pに渡さんでもfgetsが読みに行ったときにもう読む行ないならNULLも引っさげて帰ってくるからstrにNULLがはいってて
じゃーああいうふうに掛けばpいらねんじゃね?と思ったんですがなぜこれだとNULLはいってないんでしょ
もすこしだけおしえてください
fgetがfpに指定したというか登録したファイルから指定数読み込んで、それをpに渡して…
このときに文字終端ならpにNULLも渡ってそれでwhileの条件に合致して止まると思いまして ←ここまであってますか?
なら、pに渡さんでもfgetsが読みに行ったときにもう読む行ないならNULLも引っさげて帰ってくるからstrにNULLがはいってて
じゃーああいうふうに掛けばpいらねんじゃね?と思ったんですがなぜこれだとNULLはいってないんでしょ
765デフォルトの名無しさん (ワッチョイ cf63-kdx8)
2019/03/17(日) 00:48:28.87ID:hO+9vtK70 printf("%s", str);
memset(str, 0, sizeof(str));←これ入れてみ
fgets(str, 500, fp);
どうしてかは、自分で考える
memset(str, 0, sizeof(str));←これ入れてみ
fgets(str, 500, fp);
どうしてかは、自分で考える
766はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 00:50:56.68ID:aA4z/LNt0767デフォルトの名無しさん (ワッチョイ ffda-OCYI)
2019/03/17(日) 00:56:16.34ID:/bg4Vz3i0 配列名strは先頭要素のアドレス&str[0]と同じ
strの評価結果は常に同じアドレスを返す
配列が正常に確保されている限りNULLになることは無い
strの評価結果は常に同じアドレスを返す
配列が正常に確保されている限りNULLになることは無い
768デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/17(日) 00:56:29.02ID:dzL2D1Cha769デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/17(日) 00:57:37.07ID:dzL2D1Cha >>767
NULLがなにかよくわかってないことがよくわかりましたw いってきます
NULLがなにかよくわかってないことがよくわかりましたw いってきます
770デフォルトの名無しさん (ワッチョイ 035f-QpYv)
2019/03/17(日) 01:47:18.69ID:rgOA/kAB0 >>764
fgets()は成功したら配列の場所を返す(つまりp == str)けど
失敗した場合はNULLを返す(つまりp == NULL)
ここで問題なのは他の人が言ってる通り「引数にとった配列の場所は変わってない」こと
char str[500];
っていうのは(今回はファイルから文字を読み込むために)char型のデータ領域を500個確保するってことで、
わざわざ取った場所を変更したり勝手に消したりはしない
対してNULLはまぁ何もない場所のアドレスって考えでとりあえずはいいと思う
だから、strの領域の(内容は変わってるかもしれないけど)場所はfgets()の結果がNULLでも確保してあるだけだから変わらない
最初の(動いた方の)プログラムで、fgets()した後に
printf("p=%p, str=%p\n", p, str);
とかやってアドレス表示させて途中と最後比べてみたら感覚的に分かるかも
fgets()は成功したら配列の場所を返す(つまりp == str)けど
失敗した場合はNULLを返す(つまりp == NULL)
ここで問題なのは他の人が言ってる通り「引数にとった配列の場所は変わってない」こと
char str[500];
っていうのは(今回はファイルから文字を読み込むために)char型のデータ領域を500個確保するってことで、
わざわざ取った場所を変更したり勝手に消したりはしない
対してNULLはまぁ何もない場所のアドレスって考えでとりあえずはいいと思う
だから、strの領域の(内容は変わってるかもしれないけど)場所はfgets()の結果がNULLでも確保してあるだけだから変わらない
最初の(動いた方の)プログラムで、fgets()した後に
printf("p=%p, str=%p\n", p, str);
とかやってアドレス表示させて途中と最後比べてみたら感覚的に分かるかも
771デフォルトの名無しさん (ワッチョイ 2301-QTaE)
2019/03/17(日) 04:30:49.94ID:SA4RHMx10 fgets の戻りは ポインタである必要は無く、int (bool) でいいと思うんだ
printf("%p\n", fgets()) のように直接重ねても、ファイルエンドでぬるぽ踏むわけだし
printf("%p\n", fgets()) のように直接重ねても、ファイルエンドでぬるぽ踏むわけだし
772デフォルトの名無しさん (アウアウウー Sae7-WmpR)
2019/03/17(日) 05:46:27.76ID:57obmdS/a int返したらprintfに食わせられないじゃん
773デフォルトの名無しさん (ワッチョイ ff34-B/CD)
2019/03/17(日) 06:11:49.28ID:lbYyU/s40 そんなことしねえから大丈夫
774はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 15:32:50.89ID:aA4z/LNt0 暗黙の型変換で配列がポインタになるってのが諸悪の根源なんだよな。
まあそれでだいぶん書くのが楽という面もあるんだけど、
この手の思い違いが連発するのはやっぱりどこか良くない設計だったのかもなと
思わないでもない。
まあそれでだいぶん書くのが楽という面もあるんだけど、
この手の思い違いが連発するのはやっぱりどこか良くない設計だったのかもなと
思わないでもない。
775デフォルトの名無しさん (ワッチョイ ffda-B/CD)
2019/03/17(日) 16:10:49.52ID:/bg4Vz3i0 配列名や関数名はアドレスを指しているというだけであって暗黙の型変換とは無関係
776はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 16:16:25.40ID:aA4z/LNt0777デフォルトの名無しさん (ワッチョイ ffda-B/CD)
2019/03/17(日) 16:36:25.05ID:/bg4Vz3i0778はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 16:51:58.33ID:aA4z/LNt0 >>777
int[10] が int* 型に型変換されたり、 void(void) が void(*)(void) になったりするという暗黙の型変換の結果だね。
int[10] が int* 型に型変換されたり、 void(void) が void(*)(void) になったりするという暗黙の型変換の結果だね。
779デフォルトの名無しさん (ワッチョイ ffda-B/CD)
2019/03/17(日) 17:12:17.93ID:/bg4Vz3i0 >>778
配列Array[]の型はint[]型であるけど、配列名Arrayの型はint*型(値は&Array[0])
関数Func()の型はvoid(*)(void)ではあるけど、関数名Funcの型はvoid*型
暗黙の型変換など関係なくポインタに代入出来る
配列Array[]の型はint[]型であるけど、配列名Arrayの型はint*型(値は&Array[0])
関数Func()の型はvoid(*)(void)ではあるけど、関数名Funcの型はvoid*型
暗黙の型変換など関係なくポインタに代入出来る
780デフォルトの名無しさん (ワッチョイ a3f2-B/CD)
2019/03/17(日) 17:24:35.69ID:VrxWLsvb0 配列と配列名を別物としているようだけど、それなら配列と配列名を暗黙変換しているわけだろう。
781デフォルトの名無しさん (ワッチョイ ffda-B/CD)
2019/03/17(日) 17:32:23.78ID:/bg4Vz3i0 配列Array[]と配列名Arrayは別のオブジェクト
配列名Arrayは配列の先頭要素のアドレス&Array[0]と同一オブジェクトの糖衣構文
配列名Arrayは配列の先頭要素のアドレス&Array[0]と同一オブジェクトの糖衣構文
782はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/17(日) 17:47:18.78ID:aA4z/LNt0783デフォルトの名無しさん (ワッチョイ 83ad-NLsJ)
2019/03/17(日) 18:28:05.39ID:mpr7j0a20 結局何が正解なんだ
784デフォルトの名無しさん (ワッチョイ 2301-QTaE)
2019/03/17(日) 18:33:42.80ID:SA4RHMx10 sizeof の時に区別していない/区別できないのなら 糖衣構文でも納得できるんだがね
785デフォルトの名無しさん (スププ Sd1f-QpYv)
2019/03/17(日) 20:04:24.76ID:lW9CTxpwd T型の配列は一部の例外を除き「配列の先頭の要素を指すT型へのポインタへと型変換される」(C11 6.3.2.1.3)
だから暗黙の型変換で間違いない
だから暗黙の型変換で間違いない
786デフォルトの名無しさん (ワッチョイ ff34-B/CD)
2019/03/17(日) 20:47:21.33ID:lbYyU/s40787はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/18(月) 01:00:19.91ID:YfgH0B4l0 >>786
繰返しになるけど、暗黙の型変換で書くのが楽になってるのは承知してるんだってば。
ただ、初心者が (時にはベテランでも) 変な理解をしがちな理由はこれだろうな
っていう意味での根源は暗黙の型変換にあるっしょ。
繰返しになるけど、暗黙の型変換で書くのが楽になってるのは承知してるんだってば。
ただ、初心者が (時にはベテランでも) 変な理解をしがちな理由はこれだろうな
っていう意味での根源は暗黙の型変換にあるっしょ。
788デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/18(月) 04:00:43.39ID:P9Yklj5Ga おじゃまします
printf("[%s][%d][%p]\n", str, str, &str);
こう表示させたとき%sと%pに出る値は意味わかるのですが(文字列とアドレス)
はわかるのですが%dに出る数字の羅列はなにになるんですか
printf("[%s][%d][%p]\n", str, str, &str);
こう表示させたとき%sと%pに出る値は意味わかるのですが(文字列とアドレス)
はわかるのですが%dに出る数字の羅列はなにになるんですか
789はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/18(月) 04:05:51.06ID:YfgH0B4l0 >>788
str は char の配列ということでいい?
だとするとアドレス。
str が配列であれば str と &str はアドレス値として見れば同じになるはず。
型は違うけど。
(整数への変換で何が起こるかは言語仕様でははっきりした規定は無い
ので、表現が変わってしまうことな無いとは言えない。)
str は char の配列ということでいい?
だとするとアドレス。
str が配列であれば str と &str はアドレス値として見れば同じになるはず。
型は違うけど。
(整数への変換で何が起こるかは言語仕様でははっきりした規定は無い
ので、表現が変わってしまうことな無いとは言えない。)
790デフォルトの名無しさん (アウアウエー Sadf-kdx8)
2019/03/18(月) 04:51:21.12ID:P9Yklj5Ga791はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/18(月) 06:31:42.89ID:YfgH0B4l0 >>790
表示が違うのは %p は16進表示になってるとかじゃない?
表示が違うのは %p は16進表示になってるとかじゃない?
792デフォルトの名無しさん (アウアウカー Sa47-cpdB)
2019/03/18(月) 06:49:00.10ID:lirXey68a 単に%dだからアドレスの10進表記になると思ってだけど、はっきり決まってはなかったんだ。
793デフォルトの名無しさん (ワッチョイ ff34-B/CD)
2019/03/18(月) 07:14:51.68ID:/H01vbo60794デフォルトの名無しさん (アウアウカー Sa47-cpdB)
2019/03/18(月) 07:38:07.69ID:lirXey68a まぁ、双方明示的に(個人の感想です)strとキャストすべきなんだろうな。
795デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
2019/03/18(月) 14:12:42.17ID:1gtRswz3a ポインタに対してprintf()で%d指定した時ってアドレスがちゃんと出るって保証されてたっけ?
796デフォルトの名無しさん (ワッチョイ ffc5-1O1G)
2019/03/18(月) 14:15:34.40ID:BO4wFGSe0 voidのポインタの便利さに気づきました
こんな私に何かアドバイスはありますか?
こんな私に何かアドバイスはありますか?
797デフォルトの名無しさん (ワッチョイ ffa5-WhpE)
2019/03/18(月) 14:23:43.30ID:27d4/ixp0 次は汎用ポインタの不便さ面倒臭さに気付きましょう
798デフォルトの名無しさん (ワッチョイ 738f-kbMb)
2019/03/18(月) 14:23:54.47ID:mCQ8i9jz0 横質問で申し訳ない
NULL の実際の値
'\0' の実際の値
は実装依存ということで間違いない???
NULL の実際の値
'\0' の実際の値
は実装依存ということで間違いない???
799デフォルトの名無しさん (ワッチョイ 8f7c-kdx8)
2019/03/18(月) 14:29:25.93ID:xzOI+WOH0 >>798
はい、間違いはございません
はい、間違いはございません
800デフォルトの名無しさん (アウアウウー Sae7-WmpR)
2019/03/18(月) 14:46:34.54ID:O3z3BOLxa 'a' の実際の値は決まってるとでもいうのか
801はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/18(月) 14:57:23.82ID:YfgH0B4l0 >>795
保証されていない。
というより、値がアドレスには違いないのだけど
その表現がどうなっているか未定義なので、
意味のある値なのかどうかはわからない。
(常識的にはデタラメな値ということもないだろうけど……)
整数とポインタの関係について確実に保証されているのは、
ポインタをポインタのサイズより大きい整数型に入れたなら、
元の型にキャストしなおすと変換前と等しいってことくらい。
保証されていない。
というより、値がアドレスには違いないのだけど
その表現がどうなっているか未定義なので、
意味のある値なのかどうかはわからない。
(常識的にはデタラメな値ということもないだろうけど……)
整数とポインタの関係について確実に保証されているのは、
ポインタをポインタのサイズより大きい整数型に入れたなら、
元の型にキャストしなおすと変換前と等しいってことくらい。
802デフォルトの名無しさん (ワッチョイ 738f-kbMb)
2019/03/18(月) 14:59:53.22ID:mCQ8i9jz0 >>799
即レス感謝です
即レス感謝です
803デフォルトの名無しさん (ワッチョイ 738f-kbMb)
2019/03/18(月) 15:01:51.19ID:mCQ8i9jz0 >>800
実装として、ASCIIとEBICDIC以外で「これは認識してないとダメ」なものがあれば御教示くださいませんか?
実装として、ASCIIとEBICDIC以外で「これは認識してないとダメ」なものがあれば御教示くださいませんか?
804デフォルトの名無しさん (アウアウウー Sae7-lDjF)
2019/03/18(月) 15:50:43.53ID:h9s8r5rIa 一部の文字が示す値の連続性の保証があったような
805はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-kdx8)
2019/03/18(月) 15:56:04.05ID:YfgH0B4l0 >>804
数字 ('0'〜'9') に対応する文字コードが連続する保証は有る。
数字 ('0'〜'9') に対応する文字コードが連続する保証は有る。
806デフォルトの名無しさん (ワッチョイ 8369-QTaE)
2019/03/18(月) 16:33:31.22ID:CWr9PpIQ0 '0' 〜 '9' で挟んで '0' で引き算するのは保障されてるので成立するけど
'a' 〜 'f' , 'A' 〜 'F' で挟んで - 'a' + 10 や - 'A' + 10 は保障外のコードになる と。
'a' 〜 'f' , 'A' 〜 'F' で挟んで - 'a' + 10 や - 'A' + 10 は保障外のコードになる と。
807デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/18(月) 17:09:05.92ID:yKiI4G/I0 >>801
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ
先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
未定義じゃねえ処理系定義だ
未定義に該当するためには何らかの禁止を破らねばならない
禁止を破っていないのに決まっていない事項は未規定
未規定のうち文書化されるのが処理系定義だ
先輩方が変な言葉遣いをするから
若いのが勘違いするんだよ
気をつけな
808デフォルトの名無しさん (ワッチョイ 738f-kbMb)
2019/03/18(月) 17:42:10.10ID:mCQ8i9jz0809デフォルトの名無しさん (アウアウカー Sa47-WmpR)
2019/03/18(月) 17:56:16.31ID:1YRHAy75a810デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/18(月) 21:11:30.38ID:yKiI4G/I0 >>808
> 「処理系が必ず定義しなければならない」
それが処理系定義
たとえば sizeof(int) が返す値だ
> 「純粋に処理系依存なので、規格としては何も触れない」
これは未規定
たとえば printf("%d %d", getchar(), getchar()); の場合の左右の getchar の実行順序だ
わかってないんなら、ちゃんと規格票で確認しとけ
> 「処理系が必ず定義しなければならない」
それが処理系定義
たとえば sizeof(int) が返す値だ
> 「純粋に処理系依存なので、規格としては何も触れない」
これは未規定
たとえば printf("%d %d", getchar(), getchar()); の場合の左右の getchar の実行順序だ
わかってないんなら、ちゃんと規格票で確認しとけ
811デフォルトの名無しさん (ワッチョイ ff33-h1+v)
2019/03/18(月) 23:08:12.32ID:wuyTgyGr0 >>795,801 ポインタの表現形式とは関係なく、未定義の動作になります。
https://www.jpcert.or.jp/sc-rules/c-fio47-c.html
実際の処理系での挙動を説明しようとするとポインタの表現形式で説明が付く
ことが多いだろうとは思います。
https://www.jpcert.or.jp/sc-rules/c-fio47-c.html
実際の処理系での挙動を説明しようとするとポインタの表現形式で説明が付く
ことが多いだろうとは思います。
812デフォルトの名無しさん (ワッチョイ 035f-7k5p)
2019/03/18(月) 23:15:18.00ID:5t+N6Jn90 C11 7.21.6.1.9で「変換指定子が不正である場合の動作は未定義」ってあるね
処理系定義は%pの時のポインタの値の表現形式と間違えてないか
処理系定義は%pの時のポインタの値の表現形式と間違えてないか
813デフォルトの名無しさん (ワッチョイ ff33-h1+v)
2019/03/18(月) 23:23:41.88ID:wuyTgyGr0 >>810
規格で「何も」触れられていないのは未定義 (undefined) なのでは?
禁止を破るほか、規格に定めのないところの動作も含まれます。
規格で示される選択肢のうちのどれを処理系が選ぶかが定められておらず
処理系任せ(文書化も不要)なのが未規定 (unspecified) かと。
規格で「何も」触れられていないのは未定義 (undefined) なのでは?
禁止を破るほか、規格に定めのないところの動作も含まれます。
規格で示される選択肢のうちのどれを処理系が選ぶかが定められておらず
処理系任せ(文書化も不要)なのが未規定 (unspecified) かと。
814デフォルトの名無しさん (ブーイモ MMff-ouNb)
2019/03/19(火) 08:12:11.66ID:qtB10olYM 自分はc言語とc#(pcツール開発用途)使うけど、
c言語は仕様がコンパクトで、このスレのような議論があって面白いな。
c#はライブラリが充実してて凄く便利
c言語は仕様がコンパクトで、このスレのような議論があって面白いな。
c#はライブラリが充実してて凄く便利
815デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/19(火) 09:23:10.29ID:LKFNCpsT0816デフォルトの名無しさん (ワッチョイ ff33-h1+v)
2019/03/19(火) 10:26:28.12ID:gyYe55lf0 >>815
http://kikakurui.com/x3/X3010-2003-01.html#9
> この規格の制約以外の箇所で現れる…(し)なければならない又は…(し)てはならないという要求をプログラムが守っていない場合,その動作は未定義とする。
> この規格では,このほかに,用語 未定義の動作を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> これらの三つの書き方は強調度において何ら変わりはなく,それらはすべて未定義の動作を規定する。
http://kikakurui.com/x3/X3010-2003-01.html#9
> この規格の制約以外の箇所で現れる…(し)なければならない又は…(し)てはならないという要求をプログラムが守っていない場合,その動作は未定義とする。
> この規格では,このほかに,用語 未定義の動作を使うことによるか又は動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> これらの三つの書き方は強調度において何ら変わりはなく,それらはすべて未定義の動作を規定する。
817デフォルトの名無しさん (ワッチョイ 93d2-mVPS)
2019/03/19(火) 11:35:26.58ID:71/TIYaC0 未定義な動作っていうのはプログラムが未定義な動作をするわけじゃなくて
コンパイラー製作者が決める動作が未定義だから好きなように動作を決めれるってことだぞ
コンパイラー製作者が決める動作が未定義だから好きなように動作を決めれるってことだぞ
818デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/19(火) 11:43:35.24ID:LKFNCpsT0 >>816
こちらの指摘を認めたんだな?
こちらの指摘を認めたんだな?
819デフォルトの名無しさん (ドコグロ MM47-jA9u)
2019/03/19(火) 12:40:50.73ID:/V+FXtnWM ID:LKFNCpsT0は言語仕様の前に日本語を勉強すべき
> 動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
> 動作の明示的な定義を与えないことによって未定義の動作を示すこともある。
820デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/19(火) 13:28:08.89ID:LKFNCpsT0821デフォルトの名無しさん (ワッチョイ 738f-kbMb)
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
「この辺読んでおけ」ってかんじですか
> 未定義の動作を示すこともある
https://www.jpcert.or.jp/sc-rules/c-msc15-c.html
http://www.c-lang.org/detail/undefined_behavior.html
「この辺読んでおけ」ってかんじですか
822デフォルトの名無しさん (スフッ Sd1f-QpYv)
2019/03/19(火) 17:56:13.66ID:CsLrwzwwd >>815
JIS X 3010:2003 3.4.3
未規定の動作(unspecified behavior) この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。
C11 3.4.4
未規定動作
不特定の値の使用、あるいは当国際標準が提示する2つかそれ以上の可能性があり、いずれを選ぶかに関してそれ以上の要求を課さないその他の動作。
一応選択肢は与えてるように見えるな
JIS X 3010:2003 3.4.3
未規定の動作(unspecified behavior) この規格が,二つ以上の可能性を提供し,個々の場合にどの可能性を選択するかに関して何ら要求を課さない動作。
C11 3.4.4
未規定動作
不特定の値の使用、あるいは当国際標準が提示する2つかそれ以上の可能性があり、いずれを選ぶかに関してそれ以上の要求を課さないその他の動作。
一応選択肢は与えてるように見えるな
823デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/19(火) 18:02:59.01ID:LKFNCpsT0 「異常なプログラム」、「正しくないプログラム」、「正しくないデータ」
↑
このへんのキーワードが、なぜ「未定義の動作」という用語をわざわざ作っているのかの存在意義だ
他の「処理系定義の動作」や「未規定の動作」と見比べてみな
「未定義」だけ異質な点はただ1つ
↑
このへんのキーワードが、なぜ「未定義の動作」という用語をわざわざ作っているのかの存在意義だ
他の「処理系定義の動作」や「未規定の動作」と見比べてみな
「未定義」だけ異質な点はただ1つ
824デフォルトの名無しさん (ドコグロ MM47-jA9u)
2019/03/19(火) 19:53:17.00ID:/V+FXtnWM >>820
あほか、そこに「正しくないプログラム構成要素」って書いてあるだろ
規格には正しいプログラムの定義は書いてある
書いてないことは全て正しくないプログラムだよ
そもそも全ての未定義を定義できるわけないことぐらいはアホでもわかるだろw
あほか、そこに「正しくないプログラム構成要素」って書いてあるだろ
規格には正しいプログラムの定義は書いてある
書いてないことは全て正しくないプログラムだよ
そもそも全ての未定義を定義できるわけないことぐらいはアホでもわかるだろw
825デフォルトの名無しさん (ワッチョイ b302-h1+v)
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の結果がなぜそうなるのかちゃんとは分かっていません。
なぜそうなるのか分かるサイト等あれば教えてもらえませんか?
はまった部分を単純化して例を挙げます。
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と見た目そっくりでも作られるコードが少し違うんじゃないの?
C++ は extern "C" {} のブロック内にC言語書かないと駄目なんじゃなかったっけ?
で、C++って同じ関数名で引数の違う関数作れるよね。だからCと見た目そっくりでも作られるコードが少し違うんじゃないの?
827デフォルトの名無しさん (ワッチョイ 2301-QTaE)
2019/03/19(火) 21:04:51.38ID:Dro8a+Ew0 Cは関数名がそのままシンボル名になるけど
C++のほうは関数名に引数の型情報が付加されたmanglingされたシンボル名となるので
リンカーでリンケージする際に区別してる
C++ から C 関数を呼ぶには 明示的に extern "C" と宣言されてないとその機構を突破できない
んじゃなかったかな
C++のほうは関数名に引数の型情報が付加されたmanglingされたシンボル名となるので
リンカーでリンケージする際に区別してる
C++ から C 関数を呼ぶには 明示的に extern "C" と宣言されてないとその機構を突破できない
んじゃなかったかな
>>825
c++ から c の関数を呼ぶのなら extern "C"
c++ から c の関数を呼ぶのなら extern "C"
829デフォルトの名無しさん (アウアウウー Sae7-6Ib2)
2019/03/19(火) 21:14:21.98ID:BI7+7Q7/a おお。多分そうだ。
あとはもっと詳しい人に任せた。
あとはもっと詳しい人に任せた。
途中で投げてしまった
私がはまったのは、win32api で、 ::RegisterClass() にて登録する WindowProc を extern "C" しなかったために、凄く困った記憶があります
私がはまったのは、win32api で、 ::RegisterClass() にて登録する WindowProc を extern "C" しなかったために、凄く困った記憶があります
831デフォルトの名無しさん (ワッチョイ ff7c-NxE7)
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()
main()からcallされるasm用関数名が違うのでは
FuncC.c func() ---> funcC()
FuncCpp.cpp func() --> _Z4Funcv()
main.c call func() ---> call func()
main.cpp : call func() --> call _Z4Funcv()
832デフォルトの名無しさん (アウアウウー Sae7-WmpR)
2019/03/19(火) 22:56:54.72ID:ieOLeRQla まんぐり
833デフォルトの名無しさん (ワッチョイ 6f02-B/CD)
2019/03/19(火) 23:56:04.61ID:ni3gZ2OF0834デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 05:59:53.51ID:Jx7dUCON0 >>824
規格では正しくないプログラムをill-formedという
つまり正しくないプログラムも記載されているということだ
別に規格に限ったことではない
あるものが何であって何でないという境界を明確化するのは
ごく当たり前のものの書き方だ
規格では正しくないプログラムをill-formedという
つまり正しくないプログラムも記載されているということだ
別に規格に限ったことではない
あるものが何であって何でないという境界を明確化するのは
ごく当たり前のものの書き方だ
835デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 06:44:57.57ID:nNN3jHgVM >>834
> あるものが何であって何でないという境界を明確化するのは
すでに明確だろ?
「正しいプログラムでないプログラム」は「正しくないプログラム」
正しいプログラムの定義は書いてあるから境界はすでに明確だよ
ill-formedとかの名前がどうのこうのは関係ない
> あるものが何であって何でないという境界を明確化するのは
すでに明確だろ?
「正しいプログラムでないプログラム」は「正しくないプログラム」
正しいプログラムの定義は書いてあるから境界はすでに明確だよ
ill-formedとかの名前がどうのこうのは関係ない
836デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 06:54:48.64ID:Jx7dUCON0 >>835
もうやめろ見苦しいから
もうやめろ見苦しいから
837デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 07:09:56.04ID:nNN3jHgVM838デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 07:25:49.13ID:Jx7dUCON0 どっちが見苦しいか他の連中に聞いてみな
839デフォルトの名無しさん (ワッチョイ a37b-47Me)
2019/03/20(水) 08:12:13.89ID:SCVZEQpp0 「未定義」と「不定」については Phinloda さんの↓も分かりやすいね。
少々古いのが難だけど、内容は今でも正しいと思う。
初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
ところで、「不定の動作」であるが「未定義ではない」、
しかも「不定であることの影響をユーザが見ることができる」
コードの例って何かあるだろうか。
ちょいと考えてみたけど、不定の影響を見るために何かすると
そのせいで未定義の領域に突入しちゃうんだよ。
少々古いのが難だけど、内容は今でも正しいと思う。
初級C言語Q&A(7)
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html
ところで、「不定の動作」であるが「未定義ではない」、
しかも「不定であることの影響をユーザが見ることができる」
コードの例って何かあるだろうか。
ちょいと考えてみたけど、不定の影響を見るために何かすると
そのせいで未定義の領域に突入しちゃうんだよ。
840デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 08:12:56.46ID:nNN3jHgVM842デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 09:38:01.32ID:Jx7dUCON0843デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 10:13:53.38ID:nNN3jHgVM844デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 10:14:13.87ID:nNN3jHgVM >>842
はいはい、一人で吠えてろよw
はいはい、一人で吠えてろよw
845デフォルトの名無しさん (ワッチョイ 93d2-mVPS)
2019/03/20(水) 10:40:40.56ID:3Av4Lhjq0846デフォルトの名無しさん (ワッチョイ 8f7c-kdx8)
2019/03/20(水) 10:45:39.91ID:L8bJW9Z40 未定義たぁ不定野郎だ
847デフォルトの名無しさん (ドコグロ MMdf-jA9u)
2019/03/20(水) 12:24:13.19ID:nNN3jHgVM >>845
そういう話をしたいならまずは君の言う「間違い」とやらをきちんと定義してくれ
そういう話をしたいならまずは君の言う「間違い」とやらをきちんと定義してくれ
848デフォルトの名無しさん (ワッチョイ 93d2-mVPS)
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 細部に注意を払っていない
https://qiita.com/hareku/items/4bfc48e23e83e0d300f3
1 好奇心の欠如
2 自律性と機知の欠如
3 問題に直面しても粘り強さが無い
4 問題解決に成功した気持ちはない
5 学習と理解に焦る
6 思考に飽きたり疲れたりする
7 自分のことを考えられない
8 堅く、狭く、そして無秩序な考え
9 複数の答えの間の「良い」と「悪い」の連続性に気付かず、「正しい」答えを望んでいる
10 細部に注意を払っていない
850デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 15:33:42.99ID:Jx7dUCON0851デフォルトの名無しさん (ワッチョイ 93d2-mVPS)
2019/03/20(水) 15:42:05.78ID:3Av4Lhjq0852デフォルトの名無しさん (ワッチョイ 23dc-B/CD)
2019/03/20(水) 15:53:53.83ID:knvp6QUa0 ワロタw
853デフォルトの名無しさん (アークセー Sx07-kI3O)
2019/03/20(水) 15:57:42.67ID:+9jdpzuGx854デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 16:28:25.34ID:Jx7dUCON0 ブーメランぶっ刺さってやんのwww
855デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
2019/03/20(水) 16:36:56.04ID:Jx7dUCON0 日本語を勉強すべきだの、あほかだのと、無礼な態度は若気の至りと
こちらは目を瞑って色々と箇条番号やらキーワードやら出してやってたが
そろそろ見限る頃だな
こちらは目を瞑って色々と箇条番号やらキーワードやら出してやってたが
そろそろ見限る頃だな
856デフォルトの名無しさん (ワッチョイ cf63-kdx8)
2019/03/20(水) 16:44:53.17ID:fwuhbGCo0 暇でないなら、直ちに見限るべき
857デフォルトの名無しさん (ワッチョイ a37b-47Me)
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() を差し込んでも動作が変わらないように
うまくライブラリが作られてると思うけどね。
この投稿の趣旨は、「不定の動作であっても、結果を使うだけなら
プログラムとして正しい。しかし、不定の動作の内実を探ろうとすると、
その活動によって未定義動作を含んだプログラムになってしまう」っていう
不確定性原理みたいな何かが規格に仕込まれてるんじゃないか、という疑い。
(別に陰謀論をブチ上げようって意図はないので安心してくれ)
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() を差し込んでも動作が変わらないように
うまくライブラリが作られてると思うけどね。
この投稿の趣旨は、「不定の動作であっても、結果を使うだけなら
プログラムとして正しい。しかし、不定の動作の内実を探ろうとすると、
その活動によって未定義動作を含んだプログラムになってしまう」っていう
不確定性原理みたいな何かが規格に仕込まれてるんじゃないか、という疑い。
(別に陰謀論をブチ上げようって意図はないので安心してくれ)
858デフォルトの名無しさん (ワッチョイ 13b6-B/CD)
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);
}
この例では未規定の動作を含むが
その未規定がどう転んでも影響がない、
つまり依存していないので未定義の動作とはならない
そのコードが未定義かどうかは達成しようとしている目的による
たとえば、こういう場合
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);
}
この例では未規定の動作を含むが
その未規定がどう転んでも影響がない、
つまり依存していないので未定義の動作とはならない
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【地震速報】青森県で震度6強 沿岸部に津波警報 ★6 [ぐれ★]
- 「日の丸にバツ印」掲げた大学生 あいまいな国旗損壊罪に「怖い」 The Mainichi [少考さん★]
- 【音楽】BARBEE BOYS・KONTAが事故で四肢麻痺を公表、新体制で活動は継続 [少考さん★]
- 中国「捜索レーダー起動は各国の通常の手法」 火器管制用か回答せず [蚤の市★]
- 【野球】野球の未来に危機感「マイナースポーツになる」 宮本慎也氏が開催…学童大会 [尺アジ★]
- 【訃報】声優・西村知道さん死去 「SLAM DUNK」安西先生役 9月に体調不良のため一時休業 [少考さん★]
- マヨネーズにわさび、山椒、卵の黄身、ラー油、オリーブオイルを入れてよく混ぜてください
- 千晴とVIPの深夜の遊戯
- ぺこーら、地震で同僚が次々配信を止めるなか強行し続けるので悪目立ちするwww [268244553]
- 巨大地震 [957955821]
- カメラのキタムラとかいう穴場
- ひろゆき「愛があるから人は苦しまなきゃいけないんだね」
