X



C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
0004デフォルトの名無しさん (ワッチョイ 12ad-4LA+)
垢版 |
2020/09/29(火) 04:43:56.48ID:EnsnwIhp0
リンカでリンクすれば良いだけでは?
0006デフォルトの名無しさん (ワッチョイ b37c-N+m6)
垢版 |
2020/10/04(日) 09:52:20.51ID:sdY50qgq0
ttps://ideone.com/FVBJ8Q
最後の結果が納得いかないのですが
こういうものなのでしょうか?
0007デフォルトの名無しさん (ワッチョイ ffad-EdVv)
垢版 |
2020/10/04(日) 13:02:04.66ID:4IGvE5yV0
>>6
内部で2進数になっててそれを10進数に変換しているので仕方がない。
完全な形でなんとかしたい場合は内部で10進数で保持したり計算したりしてくれるライブラリを使ってそれ用にプログラムを作るしかない。
自分で工夫してやる場合は整数で計算後に割るとかだな。
0011デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 17:44:38.81ID:OhT0M+ch0
void型の値を変数に格納するにはどうすればいいですか?

int main(void) { (void)5; }
というコードではコンパイル時にてエラーが出ないため、void型の値はC言語において定義されたものだと思いました。
でもそのvoid値を格納するための変数を以下のように宣言すると、エラーが出てしまいます。
int main(void) { void hoge; }
また、void型が占有するメモリサイズを調べる前段階として、printf関数に渡す前に、以下のコードを実行してみてもエラーが出ます。
int main(void) { sizeof ((void)5); }

どうすれば、void型の値を変数に格納できますか?
なお、C言語環境を構築するのが面倒そうなので、構築が簡単なVisualC++環境で未だにC言語の勉強してます。
0012はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 18:06:44.78ID:hQVA1bdd0
>>8-9
JISX3010:2003 を確認してみたら 7.19.6.1 内に「適切な桁数へ値の丸めも行う」という記述は見つけた。
浮動小数点の扱いについてはいくつかの動作モデルが認められている旨が 5.2.4.2.2 にあり、
処理系がどれを選択したのかは float.h で定義されるいくつかのマクロでわかることになってる。

数学的なめんどい理屈があって、どのモデルであったとしても
十進数として見たときには切り捨てとも四捨五入とも言えないと思う。
0013はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 18:12:48.79ID:hQVA1bdd0
>>11

JIS3010:2003 の 6.3.2.2 にこういう規定が書かれている。
> (型 void をもつ式) の (存在しない) 値は、いかなる方法でも使ってはならない。
> ボイド式には、暗黙の型変換も明示的な型変換 (void への型変換を除く。) も適用してはならない。
> 他の型の式をボイド式として評価する場合、その値又は指示子は捨てる。
> (ボイド式は副作用のために評価する。)

つまり void は値を捨てるという意図を便宜的に型として表したものであって、
void 型にした時点でその値を利用しないという表明になる。
0014デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 18:36:30.14ID:OhT0M+ch0
>>13
・microsoftなどの処理系開発者には、プログラマがコード上でvoid型の型も値も利用できない仕様となるように求める。
・プログラマがvoid型への明示的な型変換を求めた場合は、目的の値も型も何も返さないが、C言語の裏側でゴニョゴニョと何か分からない用途に利用される

ということですか?
0015デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 19:40:33.20ID:OhT0M+ch0
それとも、void型とは、データ型というよりも、コンパイラに対して「ここでは値は得られませんよ」と教える機能を与えられた式ですか?
関数定義の引数や返り値で void が指定された場合は、「引数や返り値は得られませんよ」とコンパイラに教えてあげてるのと同様、
(void)5 という式の評価結果であるボイド式では、「この式を評価しても値は得られませんよ」と裏でコンパイラに教えてあげてるだけですか?
そして、そのJISのいう「副作用」というのは、「値は得られませんよ」とコンパイラに教えてあげることを指してますか?

また、キャスト演算子の引数や、関数の引数や返り値で指定できるので、(型のように使用されるから型じゃないけど)便宜上、void型と呼ばれているだけですか?
0016はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 19:42:41.40ID:hQVA1bdd0
>>14
何かの関数を呼び出した場合、たとえば printf("hello, world"); と書いたときに
printf も返却値はある (出力したバイト数を返す) が返却値を受け取ることをするのを忘れたのか
返却値を処理する意志がないのか、このコードからは読み取れない。
だからそういうときに (void)printf("hello, world"); と書くことで値を捨てることを明確にする、というような使い方が出来る。

プログラムの検査をするある種のソフト (いわゆる lint) は返却値を受け取っていない状態を
「疑わしい」として検出することがある。
プログラマがどういう意図を持っているかまでは機械的にチェックできないから、
何か意図があるのなら明記してくれやってわけ。

https://docs.oracle.com/cd/E19205-01/820-1209/bjaim/index.html

まあ言語仕様上は書いても書かなくても何の差もないし、
書かないことの方が多いと思うんだけど、
プログラマの意図を表明するのに使えるコメントみたいなものだという感覚でいればいいと思う。
0017デフォルトの名無しさん (ワッチョイ ffad-EdVv)
垢版 |
2020/10/04(日) 19:47:21.47ID:4IGvE5yV0
以前gccで void *p; のように宣言されている p に p++ やってるのがコンパイルエラーにならなくて驚いた事がある。
gccの拡張なのな。
0018はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 19:47:37.95ID:hQVA1bdd0
>>15
> そのJISのいう「副作用」というのは、

引数 (ときには 0 個) を与えて返却値が返ってくるというのが関数としての「作用」で、
それ以外に状態に影響を与えることは全て副作用。
たとえば printf が文字を表示したりするのも副作用。

ってなわけで、「ボイド式は副作用のために評価する。」というのは
返却値はどうでもよくて計算の過程で生じさせる副作用の方に意味があるような
式だよ〜〜ってこと。
0019はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 19:52:24.09ID:hQVA1bdd0
>>17
gcc だと sizeof(void) が 1 を返すのにもびっくりする。
C++ だと SFINAE の中で sizeof を使ったトリックを使うこともあるんだが、
g++ ではつじつまを合わせるためか変則的な挙動があってよくわからんことになってる。
0020◆QZaw55cn4c (ワッチョイ 1398-/tDp)
垢版 |
2020/10/04(日) 20:20:31.56ID:tJ8GLyXg0
>>16
>返却値を処理する意志がないのか、このコードからは読み取れない。
>だからそういうときに (void)printf("hello, world"); と書くことで値を捨てることを明確にする、というような使い方が出来る。

大昔に lint を試したことがあって、それは lint 用の書き方とばかり思っていました…
0021デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 20:50:24.88ID:OhT0M+ch0
知りたいことと回答が噛み合わないので、よくわからなかったです。
知りたいことは、(void)printf("hello, world"); が、なぜ「値を捨てることを明確にする」という結果になるかということです。
また、副作用についての言葉の意味を質問してるのではなく、void型においては具体的に何の副作用が起きてるのかを知りたかったです。
0022デフォルトの名無しさん (ワッチョイ 6fe9-Kk5w)
垢版 |
2020/10/04(日) 21:09:12.86ID:kIcOnbZ00
>>21
(void)... という記述は値を捨てることを明示する以外に意味が無いから、かな。
「void型において副作用が起きる」などということは無い。副作用を起こす可能性があるのは
(void)キャスト対象の式のほうで、その副作用は(void)の有無に関わらず生じる。

正確なところを知りたいなら自分で規格読んだらいいんじゃないの?
0023はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 21:13:07.48ID:hQVA1bdd0
>>21
> なぜ「値を捨てることを明確にする」という結果になるか

void 型になった以上はその値は使うことができないから。
わざわざ使えなくしているんだから、
使い忘れたんじゃなくて捨ててるんだなとしか解釈のしようがない。

> 具体的に何の副作用が

文字を表示するという例では不足?
値を返す以外に起こることは全て副作用なので、
変数に書き込むこともループする (ことによって時間を消費する) ことも全て副作用だよ。
0025はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/04(日) 21:26:28.40ID:hQVA1bdd0
>>15
void が型か型じゃないかということになると仕様上の理屈では型としか言いようがない。
ただし、 void 型な値は存在しない。
JIS の言葉で言えば「void 型の値の集合は空とする」ということになっている。

void へ型変換するということは非存在に変換されるので値として利用不可能になる。
0026デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 21:49:13.97ID:OhT0M+ch0
>>22
>(void)... という記述は値を捨てることを明示する以外に意味が無いから、かな。
今のところvoidの定義に「値を捨てることを明示する」という記述は見つけられなかったです。

>「void型において副作用が起きる」などということは無い。副作用を起こす可能性があるのは
言葉足らずでした。もちろん、void型の式という意味です。

>(void)キャスト対象の式のほうで、その副作用は(void)の有無に関わらず生じる。
繰り返しになりますが、void型の式におけるその具体的な副作用を質問していました。

その他のレスは重複するので省略します。
0028デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/04(日) 21:55:51.38ID:OhT0M+ch0
たぶん皆さんのいう情報源は、Cの中級者向けの教科書として有名な「Cクイックリファレンス第二版」だと思います。
この本に「キャスト演算は、関数の戻り値のような、式の値を明示的に棄却する」という一文があります。
これ以上の詳しい説明がないので、知りたかったです。
0030デフォルトの名無しさん (ワッチョイ fff9-tG2C)
垢版 |
2020/10/04(日) 22:22:22.77ID:l2oD/9jr0
>>26
プログラミング界隈では、「副作用」という単語は一般の
https://www.weblio.jp/content/%E5%89%AF%E4%BD%9C%E7%94%A8
という意味ではなく、もっと狭い
https://www.weblio.jp/content/%E5%89%AF%E4%BD%9C%E7%94%A8+%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%29
という意味があるのよ
「用語」ってやつね
https://www.weblio.jp/content/%E7%94%A8%E8%AA%9E
0031デフォルトの名無しさん (ワッチョイ e3da-2+Dn)
垢版 |
2020/10/04(日) 23:15:55.36ID:+dLgY+eW0
ISO/IEC 9899:201x Committee Draft (N1570)

6.3.2.2 void

1
The (nonexistent) value of a void expression (an expression that has type void) shall not be used in any way, and implicit or explicit conversions (except to void) shall not be applied to such an expression.
If an expression of any other type is evaluated as a void expression, its value or designator is discarded. (A void expression is evaluated for its side effects.)

これ以上何か言うべきことある?
0032デフォルトの名無しさん (ワッチョイ 6fe9-Kk5w)
垢版 |
2020/10/04(日) 23:48:26.18ID:kIcOnbZ00
>>26
void の定義は関係ないだろう。コメントで「戻り値は捨てる」と添えるのと同じ。
もちろん「コメント」の定義にも戻り値を捨てるなどという記述は無いが、それは
コメントがその意味を持ちうることを否定しない。
0033デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 05:39:47.11ID:mH/ByF4E0
>>31
英語苦手ですが、それでなんとなく分かりました。
貼っていただいたJIS規格の文章では、一行目の「a void expression」の部分と2行目の「its」の部分の訳が、翻訳する過程などで抜け落ちてたんですね。
それにより、異なる解釈をしてしまっていました。
元々の英語版を読むと、「その値又は指示子は捨てる」が、この場合のvoid式による具体的な副作用ですね。

また、以下のようなことをすればボイド式でも繰り返し利用はできますが、
(void)(void)(void)(void)(void)(void)3;
「ボイド式は利用されなくともコンパイラが警告を出さない」ということなんですね。
そして、関数呼び出し式に(void)を付ける意味は、(返り値を返す)scanf関数などの返り値をvoid式へ変換することで、
いわば、void式を返す(コンパイラが警告を出さない)関数に偽装してるということですね。
0034デフォルトの名無しさん (ワッチョイ e3da-2+Dn)
垢版 |
2020/10/05(月) 06:59:22.20ID:pDFHvNi00
>>33

> 元々の英語版を読むと、「その値又は指示子は捨てる」が、この場合のvoid式による具体的な副作用ですね。

ちげーよ
副作用という単語を勝手な意味に解釈するんじゃねぇよ
上でも言われてるだろうが

5.1.2.3 Program execution

2
Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all _side effects_, which are changes in the state of the execution environment.
_Evaluation_ of an expression in general includes both value computations and initiation of side effects.
Value computation for an lvalue expression includes determining the identity of the designated object.


void型のexpressionでは評価された値(value)を使うことはないが副作用(side effects)は生じうるから, 副作用を発生させるために(void型のexpressionを)評価(evaluate)する。
void型にキャストすることによって発生する副作用など存在しない。
0035デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 07:17:56.23ID:mH/ByF4E0
>>34
>void型にキャストすることによって発生する副作用など存在しない。
その英文の説明では、void型にキャストすることも副作用であるという内容が書かれてますね。なので副作用は存在します。
「Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all _side effects_, which are changes in the state of the execution environment.」の部分ですね。
ただ、void型の件では、それ以外の副作用も起きうるということですか?了解しました。
0036デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 07:22:14.94ID:mH/ByF4E0
あともう一つ確認したいことがあります。
(関数定義の返り値にvoidが指定されている)abort関数などは、実際にvoid式を返し、それをvoid式と呼んでますか?
それとも、評価されても何も返さない状態を指してvoid式と言ってるだけですか?

例えば「;」のみが記述された行があったとします。
もしも、何も返さない状態を指してvoid式と言うのなら、この行を評価すると何もない状態なのでvoid式となるでしょう。
一方、実際にvoid型の式があるのを指してvoid式というのなら、この行にはvoid型の式は無いので、void式ではありません。
どちらですか?
0037デフォルトの名無しさん (ワッチョイ e3da-2+Dn)
垢版 |
2020/10/05(月) 07:24:46.13ID:pDFHvNi00
>>35
> void型にキャストすることも副作用であるという内容が書かれてます

そんなことは書かれていない。
void型キャストは実行環境に変化を与えない(which are changes in the state of the execution environment. に該当しない)。
並べられている例にも当てはまるものはない。
0039デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 07:44:58.94ID:mH/ByF4E0
>>38
まあそりゃそうですけど、「;」の行は、式が省略されてるということですよね。
もしも何もない状態を指してvoid式というなら、この行に含まれる省略された式は、何もない状態なのでvoid式となります。
他方、実際にvoid型の式があるのを指して(以下略
どちらですか?
0040デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 07:49:51.66ID:mH/ByF4E0
>>37
例えば、
「x = 9+2;」という行において、9+2の評価が実行環境に影響を与えることはまず不可避だけど、この時点では副作用とは呼ばないということですか?
11が変数xに代入された時点において、副作用と呼ぶということですか?
0043デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 08:13:16.22ID:mH/ByF4E0
>>42
前半は代入前に行われる暗黙的な型変換等の話ですよね、それは厳密には副作用とは呼ばないとのことですね。
おかげで猿以下の脳から猿レベルの脳になれました。ありがとうございました。
0044デフォルトの名無しさん (ワッチョイ 6fe9-Kk5w)
垢版 |
2020/10/05(月) 08:51:14.28ID:rsZM/N9j0
>>40,41
> 9+2の評価が実行環境に影響を与えることはまず不可避

ここまだおかしくね?コンパイル時に11に置き換えられちゃえば何の影響も与えないこともあるよね?
まぁ依然として用語をいいかげんに使ってると考えれば気にするべきところではないのかもしれないけど。
0047デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 09:03:45.49ID:mH/ByF4E0
>>44
そういうどうとでもいえる話には興味がないです。

>>45
だいにゅう
【代入】
《名・ス他》計算のために、式中の文字に、ある特定の値を与えること。

まだ与えてないので代入前と表現して正解です。
0049デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 10:15:19.36ID:mH/ByF4E0
その「与える」は「オペランドを演算子に与えている」という意味ですね。式中の文字に与えているわけではありません。
今は「式中の文字に、ある特定の値を与えること」という辞書的な言葉の話です。
0050デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 10:44:29.92ID:mH/ByF4E0
>>45
>代入演算子=は、=の右辺の値を返すのが主作用
C言語を勉強し始めたばかりなので、ついでに聞きたいことがあります。
代入演算子は両辺のオペランドを受け取る2項演算子ですよね。
2項演算子の代入演算子を、関数(※引数を返り値にするのが関数の主作用)みたく捉えると、主要素と副作用は以下のようになりませんか?

例「int x; x = 5.2;」
代入演算子の主作用……x と 5.2 の2つのオペランド(引数)を受け取り、(右辺の値ではなく)代入後の左辺値 x を返す
代入演算子の副作用……左辺に代入する

実際、以下を実行すると、a = 5.2 の評価として aの中身 5 が返され、それを渡された挙動をprintf関数がしてますよね。
int a;
printf("%d", a = 5.2); // 標準出力は 5

同様に、(a = 1) + (b = 5.2) 式の評価値は6ですので、printf関数も6を標準出力します。
int a, b;
printf("%d", (a = 1) + (b = 5.2)); // 標準出力は 6
0051デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 10:47:54.33ID:mH/ByF4E0
訂正
主要素と副作用は以下のようになりませんか? ⇒ 主作用と副作用は以下のようになりませんか?
0053デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 13:37:57.61ID:mH/ByF4E0
>>52
CQ出版社『トランジスタ技術』のC言語入門でも、「副作用」を説明するために、さも大事そうに赤字にして「主作用」と書かれてるけど、これはプログラミング用語じゃないんですか?
https://toragi.cqpub.co.jp/Portals/0/backnumber/2006/10/p179-180.pdf

『実践 F# 関数型プログラミング入門』のP86でも同様の記述があるようです。
「関数においては、引数に適用して何か返り値を得ることが主たる目的であり作用です。(中略)つまり主作用ではない作用を、総じて副作用と呼びます。」
0054デフォルトの名無しさん (ブーイモ MMe7-VUFZ)
垢版 |
2020/10/05(月) 14:17:03.04ID:mCK0VB/0M
ググってもCQのページ以外では見つからんね。
副作用の説明のために使用するのは構わないと思うけど、通用する言葉じゃないから、使うならここではこういう意味ですよと言葉の定義を示す必要があるんじゃないの
0056デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 14:32:52.13ID:mH/ByF4E0
>>54
英語のwikipediaの方では日本語のwikiとは少し違う説明がされてた。
英語の副作用の項目では主作用もちゃんと触れられてて、日本語の副作用のページではこの説明が抜けてた。

https://en.wikipedia.org/wiki/Side_effect_(computer_science)
In computer science, an operation, function or expression is said to have a side effect if it modifies some state variable value(s) outside its local environment,
that is to say has an observable effect besides returning a value (the main effect) to the invoker of the operation.
訳(コンピュータサイエンスの分野では、操作、関数、または式が、そのローカル環境外で状態変数の値を変更する場合、つまり、操作の呼び出し元に値(主作用)を返す以外に観測可能な効果を持つ場合、副作用があると言われています)
0059はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6f3e-tG2C)
垢版 |
2020/10/05(月) 15:06:46.81ID:ajXL5jm+0
>>53

少なくとも C の仕様の説明には主作用という言葉は現れない。
C での副作用の説明はこうなっている。

> ボラタイルオブジェクトへのアクセス、オブジェクトの変更、ファイルの変更、
> 又はこれらのいずれかの操作を行う関数の呼出しは、すべて副作用 (side effect) と呼び、
> 実行環境の状態に変化を生じる。 式の評価は副作用を引き起こしてもよい。

何かと対比して「副」と付けているわけじゃないんだよ。

分野によっては主作用 (作用) という言葉が使われることもあるだろうが、
関数型の世界でも applicate の訳語として「作用」とあてられている場合があって、
main effect と side effect で対応付けられているとは限らない。

要するに
 ・ 用語の正確な意味は各分野の定義による
 ・ C では主作用とは言わない

逆に言えば正確でなくてよいふんわりした説明ならいいかげんに用語を使ってもいいが、
C の仕様を説明するにあたっては主作用という言葉が適切とは言えないかな、
という話。
0060デフォルトの名無しさん (ワッチョイ d32c-IT45)
垢版 |
2020/10/05(月) 15:16:14.49ID:z7kgQPv30
f( ) { x( ); }

例えば副作用は、関数x 内で、x終了後にも保持されるもの、
つまり、xの外部にあるものの状態を変えること

x内で、ローカル変数を作って消すのは、副作用ではない
0061デフォルトの名無しさん (ワッチョイ c393-gW4a)
垢版 |
2020/10/05(月) 15:55:01.80ID:mH/ByF4E0
>>59
>何かと対比して「副」と付けているわけじゃないんだよ。
まあ『「何かと対比してない」とは書いてないので、対比してるか対比してないかわからない』が、正確な表現ですよね。
0062デフォルトの名無しさん (エムゾネ FF1f-gW4a)
垢版 |
2020/10/05(月) 16:02:34.00ID:evbZz7z6F
void は戻り値省略のときと
void * のときしか使わないな
006560 (ワッチョイ d32c-IT45)
垢版 |
2020/10/06(火) 04:29:28.36ID:PeElnWrx0
副作用とは、関数型言語のモナド

ディスプレイに表示されたとか、ログ・データベースに書き込まれたとか、
関数の処理が終わった後に、関数外部の何かの状態を、永続的に変えた場合

サーバー構築は、副作用の集まり。
Ruby 製のVagrant, Chef, Cookpad製のItamae など、冪(べき)等性などでも使われる

同じ処理を何回繰り返しても、外部の状態が同じになること
0068デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/08(木) 19:44:51.48ID:UfnCY9Jf0
副作用まとめ

・CQ出版社『トランジスタ技術』
https://toragi.cqpub.co.jp/Portals/0/backnumber/2006/10/p179-180.pdf
要約すると「(値を返すという)主作用じゃないのが副作用という」

・筑波大学の亀山教授『プログラム言語論』(大学講義の資料)
http://www.cs.tsukuba.ac.jp/~kam/lecture/plm2011/5-web.pdf
要約すると「(値を返すという)主たる作用じゃないのが副作用という」

・『実践 F# 関数型プログラミング入門』のP86
要約すると「(値を返すという)主作用じゃないのが副作用という」

・英語wikipediaの副作用の説明
ttps://en.wikipedia.org/wiki/Side_effect_(computer_science)
要約すると「ローカル環境以外の状態を変化させることは、(値を返す)主作用以外のものなので、副作用と呼ぶ。」
0069デフォルトの名無しさん (ワッチョイ 06e9-xYNh)
垢版 |
2020/10/09(金) 00:16:53.25ID:Sv65jxff0
個人的なメモとしてなら好きにまとめてくれていいんだけど
C言語に限れば>>34が国際標準(共通認識)なので、どうしても「主作用」という言葉を使った話がしたいなら
それらの文献と同様に(その場における)定義を添えましょう。
0070デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 04:34:08.16ID:NuSz27BH0
>>69
まあ既に説明したように、
「Cには主作用という概念は存在しない」とは書いてないので、それは不正確な表現ですよね。
0071デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 04:43:13.97ID:NuSz27BH0
まあ、プログラミング界隈の人達に
ttps://en.wikipedia.org/wiki/Side_effect_(computer_science)
のように説明される副作用の概念があり、Cでもそれを「借りてきて」副作用という言葉を使ってるのだから、主作用という概念自体はCの規格を書いた人の頭にもあるんだよ。
0072デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 05:34:51.35ID:NuSz27BH0
オライリージャパンのCクイックリファレンス第二版を調べてみても
副作用の説明は次のように始まる。

「式の評価は、値を得られるだけでなく、実行環境に副作用と呼ばれる別の変化を起こすことがある」

皆は同じ説明の仕方で、「値を得られる」という主作用に触れて副作用の説明してるのに、なんでこのスレだけはこの概念に触れちゃ駄目なの?
ちなみに、このオライリー本の著者はC言語のエキスパートとして世界的に有名です
0073デフォルトの名無しさん (ワッチョイ 7b7f-nZE0)
垢版 |
2020/10/09(金) 07:05:22.54ID:4a3ez4RS0
>>68
必死に探してそれしか見つけられなかったんだろう?
出てきたとしても副作用の説明のために使われるだけ。
プログラミング界隈で主作用という言葉はまるで市民権を得てないんだよ
そんなにこだわるなら今後使ってもらえるように頑張りなよ
0074デフォルトの名無しさん (アウアウウー Sa2f-uINc)
垢版 |
2020/10/09(金) 07:11:00.69ID:oLqzRy4la
>>72
「副作用」といわれる作用の他に、一般的な意味での主たる作用として値が得られること自体を否定してる人はいないだろ。
ただC言語の規格としては「副作用」と対になる「主作用」という用語や概念は規定されておらず、副作用と言う語と同等に主作用を語るのは気持ち悪いな。
変数の説明のために便宜的に値をいれる箱ですよという言い方がよくされるけど、お前さんの挙げた文献における「主作用」も同様で、副作用に対する主たる作用の説明のために持ち出した一般名詞というだけだろう。
0075デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:13:51.95ID:NuSz27BH0
>>73
なんでそんなに主作用という言葉に拘って批判してるの?
主作用でも作用でもなんでもいい。
0076デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:15:48.04ID:NuSz27BH0
>>74
なんでそんなに主作用という言葉に拘って批判してるの?
主作用でも作用でもなんでもいい。
0077デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:19:20.79ID:NuSz27BH0
>>74
>C言語の規格としては「副作用」と対になる「主作用」という用語や概念は規定されておらず、副作用と言う語と同等に主作用を語るのは気持ち悪いな。
結局、プログラムにおける一般的な概念はここでは触れてはだめだということですか?
Cもプログラミングなのに。
誰もがその概念に触れた上で副作用について説明してるのに。Cクイックリファレンス第二版でもそう。
0079デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:30:12.69ID:NuSz27BH0
>>78
オライリー本ですらアウトということですか?
逆に、主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられないんだが。
0080デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:32:00.31ID:NuSz27BH0
あと、ワッチョイ変えて自演連投してるやろ
過疎スレに急に人が集まるのはおかしい
008160 (ワッチョイ 672c-Dl/i)
垢版 |
2020/10/09(金) 07:39:39.09ID:760t1BpC0
別に主作用が値を返すこととは、思っていないから

式は値を返すけど、文は返さない。
関数も返すとは限らない

自動的に、最後に評価された値を返しても、受け取って使うとは限らない。
あまり、主作用を論じることがない

副作用は、C でも使うけど、主に関数型言語のモナド
0084デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:47:01.31ID:NuSz27BH0
>>81
たぶん、君は作用とか状態とかが何を指すかを誤解してるのだと思う。
自分も数日前までは知らなかったけど、もう理解した。
0085デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:49:33.79ID:NuSz27BH0
>>82
だから?そんな話はしてない。
0087デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 07:51:33.89ID:NuSz27BH0
>>86
図星だったんだね
0090デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 08:00:39.91ID:NuSz27BH0
はいはい
0091デフォルトの名無しさん (ワッチョイ 07b7-xYNh)
垢版 |
2020/10/09(金) 08:09:12.19ID:TjErAM+z0
>>85
> 主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられないんだが。

おまえさん、こう言ったろ?
ISO/IEC 9899:2011はmain effectという概念に触れずにside effectというものを説明してるぞ
おまえさんが見つけられない本を紹介してやったんだよ
0092デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 08:10:10.53ID:NuSz27BH0
>>91
解説書じゃなく規格書だろうに。一般常識なんてわざわざ説明してるわけない。
0093デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 08:11:04.89ID:NuSz27BH0
オライリー本(Cクイックリファレンス第二版)でも、主作用という概念に触れて副作用について説明している。
英語のwikipediaでも当然のように主作用という概念に触れた上で、副作用の説明がなされている。
逆に、主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられない。

ちなみに、規格書は解説書じゃなんだから、一般常識はいちいち書いてなくて当然。
とりあえず、C言語等の解説書で、副作用について解説がなされている本で、主作用という概念について一切触れられてない本があれば挙げてくれ。
そんな本は、図書館に行って調べたけど、一つも無かったから。もしかしたら、ごく一部にあるのかもしれないけど、まずないから。
009460 (ワッチョイ 672c-Dl/i)
垢版 |
2020/10/09(金) 08:16:29.40ID:760t1BpC0
副作用は、Elixir みたいな関数型言語で使うだけ。
パイプライン

Ruby でも、メソッドチェーンする

副作用が怖いから、皆この手の言語では、
状態を持つな、map, map ばっかり言うw
0096デフォルトの名無しさん (ワッチョイ c393-YQ4O)
垢版 |
2020/10/09(金) 08:24:25.86ID:NuSz27BH0
>>95
ようするに、社則に「社員は勤務中に呼吸をしなくてはならない」とは書いてないから、「社員は呼吸禁止」ですか?
オライリー本その他も当然のように触れている、プログラミングの一般常識には、このスレでは触れてはダメということですか?
C言語もプログラミングなのに、プログラミングの一般常識には触れてはだめですか?
0099デフォルトの名無しさん (トンモー MMff-0hVy)
垢版 |
2020/10/09(金) 09:09:51.23ID:1HKZBnpVM
仕様書のside effectは、sideでないものを念頭に置くからsideという
main的なものが念頭に置かれているのを否定するやつはアホしかいない
それが何かは英wikiのside effectにも書かれてあるじゃないか

次元が低すぎだろ
0103デフォルトの名無しさん (ワッチョイ 4ab3-ICsZ)
垢版 |
2020/10/09(金) 17:02:12.86ID:RcOsUEk40
ま JIS規格のは「副」作用なんやから 作用(主作用)前提でこそのワードチョイスやん
そこを触れるの嫌がるって無理ありすぎやろ
しまいにはwでファビョる始末
■ このスレッドは過去ログ倉庫に格納されています

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