C言語なら俺に聞け 156at TECH
C言語なら俺に聞け 156 - 暇つぶし2ch2:はちみつ餃子
20/09/28 17:15:25.66 VnC2vdM30.net
2get

3:
20/09/28 18:59:35.35 ZZCh9OIz0.net
スレリンク(tech板:979番)
スタートアップを差し替えられるのは MS-DOS 時代の bcc または msc6(msvc6 とは違います!!!) くらいしか思い浮かばないのです…

4:デフォルトの名無しさん
20/09/29 04:43:56.48 EnsnwIhp0.net
リンカでリンクすれば良いだけでは?

5:デフォルトの名無しさん
20/09/29 08:52:38.84 Pb7kfi6i0.net
gccなんかld -Tでどうにでもできるやん

6:デフォルトの名無しさん
20/10/04 09:52:20.51 sdY50qgq0.net
URLリンク(ideone.com)
最後の結果が納得いかないのですが
こういうものなのでしょうか?

7:デフォルトの名無しさん
20/10/04 13:02:04.66 4IGvE5yV0.net
>>6
内部で2進数になっててそれを10進数に変換しているので仕方がない。
完全な形でなんとかしたい場合は内部で10進数で保持したり計算したりしてくれるライブラリを使ってそれ用にプログラムを作るしかない。
自分で工夫してやる場合は整数で計算後に割るとかだな。

8:デフォルトの名無しさん
20/10/04 13:05:33.55 jSKQ3LlrF.net
%f って四捨五入してる訳じゃないんです?

9:デフォルトの名無しさん
20/10/04 14:51:56.18 cq4wRGXQM.net
切り捨てじゃない?

10:デフォルトの名無しさん
20/10/04 15:38:21.66 LHD68+0w0.net
そこでCOBOLですよ。
やはり初心者にはCOBOL

11:デフォルトの名無しさん
20/10/04 17:44:38.81 OhT0M+ch0.net
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言語の勉強してます。

12:はちみつ餃子
20/10/04 18:06:44.78 hQVA1bdd0.net
>>8-9
JISX3010:2003 を確認してみたら 7.19.6.1 内に「適切な桁数へ値の丸めも行う」という記述は見つけた。
浮動小数点の扱いについてはいくつかの動作モデルが認められている旨が 5.2.4.2.2 にあり、
処理系がどれを選択したのかは float.h で定義されるいくつかのマクロでわかることになってる。
数学的なめんどい理屈があって、どのモデルであったとしても
十進数として見たときには切り捨てとも四捨五入とも言えないと思う。

13:はちみつ餃子
20/10/04 18:12:48.79 hQVA1bdd0.net
>>11
JIS3010:2003 の 6.3.2.2 にこういう規定が書かれている。
> (型 void をもつ式) の (存在しない) 値は、いかなる方法でも使ってはならない。
> ボイド式には、暗黙の型変換も明示的な型変換 (void への型変換を除く。) も適用してはならない。
> 他の型の式をボイド式として評価する場合、その値又は指示子は捨てる。
> (ボイド式は副作用のために評価する。)
つまり void は値を捨てるという意図を便宜的に型として表したものであって、
void 型にした時点でその値を利用しないという表明になる。

14:デフォルトの名無しさん
20/10/04 18:36:30.14 OhT0M+ch0.net
>>13
・microsoftなどの処理系開発者には、プログラマがコード上でvoid型の型も値も利用できない仕様となるように求める。
・プログラマがvoid型への明示的な型変換を求めた場合は、目的の値も型も何も返さないが、C言語の裏側でゴニョゴニョと何か分からない用途に利用される
ということですか?

15:デフォルトの名無しさん
20/10/04 19:40:33.20 OhT0M+ch0.net
それとも、void型とは、データ型というよりも、コンパイラに対して「ここでは値は得られませんよ」と教える機能を与えられた式ですか?
関数定義の引数や返り値で void が指定された場合は、「引数や返り値は得られませんよ」とコンパイラに教えてあげてるのと同様、
(void)5 という式の評価結果であるボイド式では、「この式を評価しても値は得られませんよ」と裏でコンパイラに教えてあげてるだけですか?
そして、そのJISのいう「副作用」というのは、「値は得られませんよ」とコンパイラに教えてあげることを指してますか?
また、キャスト演算子の引数や、関数の引数や返り値で指定できるので、(型のように使用されるから型じゃないけど)便宜上、void型と呼ばれているだけですか?

16:はちみつ餃子
20/10/04 19:42:41.40 hQVA1bdd0.net
>>14
何かの関数を呼び出した場合、たとえば printf("hello, world"); と書いたときに
printf も返却値はある (出力したバイト数を返す) が返却値を受け取ることをするのを忘れたのか
返却値を処理する意志がないのか、このコードからは読み取れない。
だからそういうときに (void)printf("hello, world"); と書くことで値を捨てることを明確にする、というような使い方が出来る。
プログラムの検査をするある種のソフト (いわゆる lint) は返却値を受け取っていない状態を
「疑わしい」として検出することがある。
プログラマがどういう意図を持っているかまでは機械的にチェックできないから、
何か意図があるのなら明記してくれやってわけ。
URLリンク(docs.oracle.com)
まあ言語仕様上は書いても書かなくても何の差もないし、
書かないことの方が多いと思うんだけど、
プログラマの意図を表明するのに使えるコメントみたいなものだという感覚でいればいいと思う。

17:デフォルトの名無しさん
20/10/04 19:47:21.47 4IGvE5yV0.net
以前gccで void *p; のように宣言されている p に p++ やってるのがコンパイルエラーにならなくて驚いた事がある。
gccの拡張なのな。

18:はちみつ餃子
20/10/04 19:47:37.95 hQVA1bdd0.net
>>15
> そのJISのいう「副作用」というのは、
引数 (ときには 0 個) を与えて返却値が返ってくるというのが関数としての「作用」で、
それ以外に状態に影響を与えることは全て副作用。
たとえば printf が文字を表示したりするのも副作用。
ってなわけで、「ボイド式は副作用のために評価する。」というのは
返却値はどうでもよくて計算の過程で生じさせる副作用の方に意味があるような
式だよ~~ってこと。

19:はちみつ餃子
20/10/04 19:52:24.09 hQVA1bdd0.net
>>17
gcc だと sizeof(void) が 1 を返すのにもびっくりする。
C++ だと SFINAE の中で sizeof を使ったトリックを使うこともあるんだが、
g++ ではつじつまを合わせるためか変則的な挙動があってよくわからんことになってる。

20:
20/10/04 20:20:31.56 tJ8GLyXg0.net
>>16
>返却値を処理する意志がないのか、このコードからは読み取れない。
>だからそういうときに (void)printf("hello, world"); と書くことで値を捨てることを明確にする、というような使い方が出来る。
大昔に lint を試したことがあって、それは lint 用の書き方とばかり思っていました…

21:デフォルトの名無しさん
20/10/04 20:50:24.88 OhT0M+ch0.net
知りたいことと回答が噛み合わないので、よくわからなかったです。
知りたいことは、(void)printf("hello, world"); が、なぜ「値を捨てることを明確にする」という結果になるかということです。
また、副作用についての言葉の意味を質問してるのではなく、void型においては具体的に何の副作用が起きてるのかを知りたかったです。

22:デフォルトの名無しさん
20/10/04 21:09:12.86 kIcOnbZ00.net
>>21
(void)... という記述は値を捨てることを明示する以外に意味が無いから、かな。
「void型において副作用が起きる」などということは無い。副作用を起こす可能性があるのは
(void)キャスト対象の式のほうで、その副作用は(void)の有無に関わらず生じる。
正確なところを知りたいなら自分で規格読んだらいいんじゃないの?

23:はちみつ餃子
20/10/04 21:13:07.48 hQVA1bdd0.net
>>21
> なぜ「値を捨てることを明確にする」という結果になるか
void 型になった以上はその値は使うことができないから。
わざわざ使えなくしているんだから、
使い忘れたんじゃなくて捨ててるんだなとしか解釈のしようがない。
> 具体的に何の副作用が
文字を表示するという例では不足?
値を返す以外に起こることは全て副作用なので、
変数に書き込むこともループする (ことによって時間を消費する) ことも全て副作用だよ。

24:はちみつ餃子
20/10/04 21:14:38.31 hQVA1bdd0.net
>>22
なるほど! >>21 は副作用というのを void の効果のことと誤解しているのか。
それは読み取れなかった。

25:はちみつ餃子
20/10/04 21:26:28.40 hQVA1bdd0.net
>>15
void が型か型じゃないかということになると仕様上の理屈では型としか言いようがない。
ただし、 void 型な値は存在しない。
JIS の言葉で言えば「void 型の値の集合は空とする」ということになっている。
void へ型変換するということは非存在に変換されるので値として利用不可能になる。

26:デフォルトの名無しさん
20/10/04 21:49:13.97 OhT0M+ch0.net
>>22
>(void)... という記述は値を捨てることを明示する以外に意味が無いから、かな。
今のところvoidの定義に「値を捨てることを明示する」という記述は見つけられなかったです。
>「void型において副作用が起きる」などということは無い。副作用を起こす可能性があるのは
言葉足らずでした。もちろん、void型の式という意味です。
>(void)キャスト対象の式のほうで、その副作用は(void)の有無に関わらず生じる。
繰り返しになりますが、void型の式におけるその具体的な副作用を質問していました。
その他のレスは重複するので省略します。

27:デフォルトの名無しさん
20/10/04 21:50:10.81 FWH29Af20.net
voidそのものは実体を持たないがポインタを派生することは出来る
というかポインタのためだけに存在しているようなもの

28:デフォルトの名無しさん
20/10/04 21:55:51.38 OhT0M+ch0.net
たぶん皆さんのいう情報源は、Cの中級者向けの教科書として有名な「Cクイックリファレンス第二版」だと思います。
この本に「キャスト演算は、関数の戻り値のような、式の値を明示的に棄却する」という一文があります。
これ以上の詳しい説明がないので、知りたかったです。

29:はちみつ餃子
20/10/04 21:58:09.05 hQVA1bdd0.net
>>26
値を返す以外に起きることは全て副作用なので具体的にと言っても困るんやが……。

30:デフォルトの名無しさん
20/10/04 22:22:22.77 l2oD/9jr0.net
>>26
プログラミング界隈では、「副作用」という単語は一般の
URLリンク(www.weblio.jp)
という意味ではなく、もっと狭い
URLリンク(www.weblio.jp)
という意味があるのよ
「用語」ってやつね
URLリンク(www.weblio.jp)

31:デフォルトの名無しさん
20/10/04 23:15:55.36 +dLgY+eW0.net
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.)
これ以上何か言うべきことある?

32:デフォルトの名無しさん
20/10/04 23:48:26.18 kIcOnbZ00.net
>>26
void の定義は関係ないだろう。コメントで「戻り値は捨てる」と添えるのと同じ。
もちろん「コメント」の定義にも戻り値を捨てるなどという記述は無いが、それは
コメントがその意味を持ちうることを否定しない。

33:デフォルトの名無しさん
20/10/05 05:39:47.11 mH/ByF4E0.net
>>31
英語苦手ですが、それでなんとなく分かりました。
貼っていただいたJIS規格の文章では、一行目の「a void expression」の部分と2行目の「its」の部分の訳が、翻訳する過程などで抜け落ちてたんですね。
それにより、異なる解釈をしてしまっていました。
元々の英語版を読むと、「その値又は指示子は捨てる」が、この場合のvoid式による具体的な副作用ですね。
また、以下のようなことをすればボイド式でも繰り返し利用はできますが、
(void)(void)(void)(void)(void)(void)3;
「ボイド式は利用されなくともコンパイラが警告を出さない」ということなんですね。
そして、関数呼び出し式に(void)を付ける意味は、(返り値を返す)scanf関数などの返り値をvoid式へ変換することで、
いわば、void式を返す(コンパイラが警告を出さない)関数に偽装してるということですね。

34:デフォルトの名無しさん
20/10/05 06:59:22.20 pDFHvNi00.net
>>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型にキャストすることによって発生する副作用など存在しない。

35:デフォルトの名無しさん
20/10/05 07:17:56.23 mH/ByF4E0.net
>>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型の件では、それ以外の副作用も起きうるということですか?了解しました。

36:デフォルトの名無しさん
20/10/05 07:22:14.94 mH/ByF4E0.net
あともう一つ確認したいことがあります。
(関数定義の返り値にvoidが指定されている)abort関数などは、実際にvoid式を返し、それをvoid式と呼んでますか?
それとも、評価されても何も返さない状態を指してvoid式と言ってるだけですか?
例えば「;」のみが記述された行があったとします。
もしも、何も返さない状態を指してvoid式と言うのなら、この行を評価すると何もない状態なのでvoid式となるでしょう。
一方、実際にvoid型の式があるのを指してvoid式というのなら、この行にはvoid型の式は無いので、void式ではありません。
どちらですか?

37:デフォルトの名無しさん
20/10/05 07:24:46.13 pDFHvNi00.net
>>35
> void型にキャストすることも副作用であるという内容が書かれてます
そんなことは書かれていない。
void型キャストは実行環境に変化を与えない(which are changes in the state of the execution environment. に該当しない)。
並べられている例にも当てはまるものはない。

38:デフォルトの名無しさん
20/10/05 07:32:22.64 pbRvW+EE0.net
>>36
;のみが書かれている行は、そもそも「式」ではなく「文」だ

39:デフォルトの名無しさん
20/10/05 07:44:58.94 mH/ByF4E0.net
>>38
まあそりゃそうですけど、「;」の行は、式が省略されてるということですよね。
もしも何もない状態を指してvoid式というなら、この行に含まれる省略された式は、何もない状態なのでvoid式となります。
他方、実際にvoid型の式があるのを指して(以下略
どちらですか?

40:デフォルトの名無しさん
20/10/05 07:49:51.66 mH/ByF4E0.net
>>37
例えば、
「x = 9+2;」という行において、9+2の評価が実行環境に影響を与えることはまず不可避だけど、この時点では副作用とは呼ばないということですか?
11が変数xに代入された時点において、副作用と呼ぶということですか?

41:デフォルトの名無しさん
20/10/05 07:51:34.73 pDFHvNi00.net
>>40
その通りだ

42:デフォルトの名無しさん
20/10/05 07:55:47.69 pDFHvNi00.net
正確に言えば代入式 a = b は右辺式の値と同じ値に評価され, 副作用として左辺式に右辺式の値を代入する。

43:デフォルトの名無しさん
20/10/05 08:13:16.22 mH/ByF4E0.net
>>42
前半は代入前に行われる暗黙的な型変換等の話ですよね、それは厳密には副作用とは呼ばないとのことですね。
おかげで猿以下の脳から猿レベルの脳になれました。ありがとうございました。

44:デフォルトの名無しさん
20/10/05 08:51:14.28 rsZM/N9j0.net
>>40,41
> 9+2の評価が実行環境に影響を与えることはまず不可避
ここまだおかしくね?コンパイル時に11に置き換えられちゃえば何の影響も与えないこともあるよね?
まぁ依然として用語をいいかげんに使ってると考えれば気にするべきところではないのかもしれないけど。

45:デフォルトの名無しさん
20/10/05 08:57:10.62 i1iukTTR0.net
「代入前に行われる暗黙的な型変換等の話」じゃないよ
代入演算子そのものの動作の話だよ
代入演算子=は、=の右辺の値を返すのが主作用

46:はちみつ餃子
20/10/05 09:01:15.32 ajXL5jm+0.net
C の仕様は C の仕様で与えられる抽象機械の動作モデルとして定義される。
現実の実行環境とは関係ないんで、そこらへんは分けて考えて。

47:デフォルトの名無しさん
20/10/05 09:03:45.49 mH/ByF4E0.net
>>44
そういうどうとでもいえる話には興味がないです。
>>45
だいにゅう
【代入】
《名・ス他》計算のために、式中の文字に、ある特定の値を与えること。
まだ与えてないので代入前と表現して正解です。

48:デフォルトの名無しさん
20/10/05 09:52:54.49 i1iukTTR0.net
いいえ、与えてます
値を与えなかったら代入できません
演算子が値を返すのは演算した後です
前の話じゃないんだってば

49:デフォルトの名無しさん
20/10/05 10:15:19.36 mH/ByF4E0.net
その「与える」は「オペランドを演算子に与えている」という意味ですね。式中の文字に与えているわけではありません。
今は「式中の文字に、ある特定の値を与えること」という辞書的な言葉の話です。

50:デフォルトの名無しさん
20/10/05 10:44:29.92 mH/ByF4E0.net
>>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

51:デフォルトの名無しさん
20/10/05 10:47:54.33 mH/ByF4E0.net
訂正
主要素と副作用は以下のようになりませんか? ⇒ 主作用と副作用は以下のようになりませんか?

52:デフォルトの名無しさん
20/10/05 12:36:55.93 rsZM/N9j0.net
「主作用」なんて定義不明なオレオレ用語を持ち出して同意を求められても好きにしろとしか言えないと思うんだ。

53:デフォルトの名無しさん
20/10/05 13:37:57.61 mH/ByF4E0.net
>>52
CQ出版社『トランジスタ技術』のC言語入門でも、「副作用」を説明するために、さも大事そうに赤字にして「主作用」と書かれてるけど、これはプログラミング用語じゃないんですか?
URLリンク(toragi.cqpub.co.jp)
『実践 F# 関数型プログラミング入門』のP86でも同様の記述があるようです。
「関数においては、引数に適用して何か返り値を得ることが主たる目的であり作用です。(中略)つまり主作用ではない作用を、総じて副作用と呼びます。」

54:デフォルトの名無しさん
20/10/05 14:17:03.04 mCK0VB/0M.net
ググってもCQのページ以外では見つからんね。
副作用の説明のために使用するのは構わないと思うけど、通用する言葉じゃないから、使うならここではこういう意味ですよと言葉の定義を示す必要があるんじゃないの

55:デフォルトの名無しさん
20/10/05 14:20:18.26 qDvF9d5o0.net
文脈として通じるのなら良いと思うよ
通じないやつも居るようだがそれなら黙ってればいい

56:デフォルトの名無しさん
20/10/05 14:32:52.13 mH/ByF4E0.net
>>54
英語のwikipediaの方では日本語のwikiとは少し違う説明がされてた。
英語の副作用の項目では主作用もちゃんと触れられてて、日本語の副作用のページではこの説明が抜けてた。
URLリンク(en.wikipedia.org)(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.
訳(コンピュータサイエンスの分野では、操作、関数、または式が、そのローカル環境外で状態変数の値を変更する場合、つまり、操作の呼び出し元に値(主作用)を返す以外に観測可能な効果を持つ場合、副作用があると言われています)

57:デフォルトの名無しさん
20/10/05 14:38:34.04 mCK0VB/0M.net
main effectという単語が使われている計算機科学のページは探したかい?
あくまでside effectの説明のためにその場限りで薬学から借りてきた言葉なんだよ

58:デフォルトの名無しさん
20/10/05 14:40:08.47 +Vcq4jVF0.net
URLリンク(img.dailyportalz.jp)

59:はちみつ餃子
20/10/05 15:06:46.81 ajXL5jm+0.net
>>53
少なくとも C の仕様の説明には主作用という言葉は現れない。
C での副作用の説明はこうなっている。
> ボラタイルオブジェクトへのアクセス、オブジェクトの変更、ファイルの変更、
> 又はこれらのいずれかの操作を行う関数の呼出しは、すべて副作用 (side effect) と呼び、
> 実行環境の状態に変化を生じる。 式の評価は副作用を引き起こしてもよい。
何かと対比して「副」と付けているわけじゃないんだよ。
分野によっては主作用 (作用) という言葉が使われることもあるだろうが、
関数型の世界でも applicate の訳語として「作用」とあてられている場合があって、
main effect と side effect で対応付けられているとは限らない。
要するに
 ・ 用語の正確な意味は各分野の定義による
 ・ C では主作用とは言わない
逆に言えば正確でなくてよいふんわりした説明ならいいかげんに用語を使ってもいいが、
C の仕様を説明するにあたっては主作用という言葉が適切とは言えないかな、
という話。

60:デフォルトの名無しさん
20/10/05 15:16:14.49 z7kgQPv30.net
f( ) { x( ); }
例えば副作用は、関数x 内で、x終了後にも保持されるもの、
つまり、xの外部にあるものの状態を変えること
x内で、ローカル変数を作って消すのは、副作用ではない

61:デフォルトの名無しさん
20/10/05 15:55:01.80 mH/ByF4E0.net
>>59
>何かと対比して「副」と付けているわけじゃないんだよ。
まあ『「何かと対比してない」とは書いてないので、対比してるか対比してないかわからない』が、正確な表現ですよね。

62:デフォルトの名無しさん
20/10/05 16:02:34.00 evbZz7z6F.net
void は戻り値省略のときと
void * のときしか使わないな

63:デフォルトの名無しさん
20/10/05 16:23:19.64 kpO4fuI3M.net
>>59
常識的に考えたら主作用あってこその副作用

64:デフォルトの名無しさん
20/10/05 18:27:51.05 yKl6yS5S0.net
仕様書の片隅から誰も使ってない用語引っ張り出してくるのは簡便してほしいわ。

65:60
20/10/06 04:29:28.36 PeElnWrx0.net
副作用とは、関数型言語のモナド
ディスプレイに表示されたとか、ログ・データベースに書き込まれたとか、
関数の処理が終わった後に、関数外部の何かの状態を、永続的に変えた場合
サーバー構築は、副作用の集まり。
Ruby 製のVagrant, Chef, Cookpad製のItamae など、冪(べき)等性などでも使われる
同じ処理を何回繰り返しても、外部の状態が同じになること

66:デフォルトの名無しさん
20/10/06 06:52:51.94 KQx0qL8O0.net
またRuby君か
カオスだな

67:デフォルトの名無しさん
20/10/06 06:53:38.32 2iI+f89O0.net
riskとbenefitじゃ全然意味違うね

68:デフォルトの名無しさん
20/10/08 19:44:51.48 UfnCY9Jf0.net
副作用まとめ
・CQ出版社『トランジスタ技術』
URLリンク(toragi.cqpub.co.jp)
要約すると「(値を返すという)主作用じゃないのが副作用という」
・筑波大学の亀山教授『プログラム言語論』(大学講義の資料)
URLリンク(www.cs.tsukuba.ac.jp)
要約すると「(値を返すという)主たる作用じゃないのが副作用という」
・『実践 F# 関数型プログラミング入門』のP86
要約すると「(値を返すという)主作用じゃないのが副作用という」
・英語wikipediaの副作用の説明
URLリンク(en.wikipedia.org)(computer_science)
要約すると「ローカル環境以外の状態を変化させることは、(値を返す)主作用以外のものなので、副作用と呼ぶ。」

69:デフォルトの名無しさん
20/10/09 00:16:53.25 Sv65jxff0.net
個人的なメモとしてなら好きにまとめてくれていいんだけど
C言語に限れば>>34が国際標準(共通認識)なので、どうしても「主作用」という言葉を使った話がしたいなら
それらの文献と同様に(その場における)定義を添えましょう。

70:デフォルトの名無しさん
20/10/09 04:34:08.16 NuSz27BH0.net
>>69
まあ既に説明したように、
「Cには主作用という概念は存在しない」とは書いてないので、それは不正確な表現ですよね。

71:デフォルトの名無しさん
20/10/09 04:43:13.97 NuSz27BH0.net
まあ、プログラミング界隈の人達に
URLリンク(en.wikipedia.org)(computer_science)
のように説明される副作用の概念があり、Cでもそれを「借りてきて」副作用という言葉を使ってるのだから、主作用という概念自体はCの規格を書いた人の頭にもあるんだよ。

72:デフォルトの名無しさん
20/10/09 05:34:51.35 NuSz27BH0.net
オライリージャパンのCクイックリファレンス第二版を調べてみても
副作用の説明は次のように始まる。
「式の評価は、値を得られるだけでなく、実行環境に副作用と呼ばれる別の変化を起こすことがある」
皆は同じ説明の仕方で、「値を得られる」という主作用に触れて副作用の説明してるのに、なんでこのスレだけはこの概念に触れちゃ駄目なの?
ちなみに、このオライリー本の著者はC言語のエキスパートとして世界的に有名です

73:デフォルトの名無しさん
20/10/09 07:05:22.54 4a3ez4RS0.net
>>68
必死に探してそれしか見つけられなかったんだろう?
出てきたとしても副作用の説明のために使われるだけ。
プログラミング界隈で主作用という言葉はまるで市民権を得てないんだよ
そんなにこだわるなら今後使ってもらえるように頑張りなよ

74:デフォルトの名無しさん
20/10/09 07:11:00.69 oLqzRy4la.net
>>72
「副作用」といわれる作用の他に、一般的な意味での主たる作用として値が得られること自体を否定してる人はいないだろ。
ただC言語の規格としては「副作用」と対になる「主作用」という用語や概念は規定されておらず、副作用と言う語と同等に主作用を語るのは気持ち悪いな。
変数の説明のために便宜的に値をいれる箱ですよという言い方がよくされるけど、お前さんの挙げた文献における「主作用」も同様で、副作用に対する主たる作用の説明のために持ち出した一般名詞というだけだろう。

75:デフォルトの名無しさん
20/10/09 07:13:51.95 NuSz27BH0.net
>>73
なんでそんなに主作用という言葉に拘って批判してるの?
主作用でも作用でもなんでもいい。

76:デフォルトの名無しさん
20/10/09 07:15:48.04 NuSz27BH0.net
>>74
なんでそんなに主作用という言葉に拘って批判してるの?
主作用でも作用でもなんでもいい。

77:デフォルトの名無しさん
20/10/09 07:19:20.79 NuSz27BH0.net
>>74
>C言語の規格としては「副作用」と対になる「主作用」という用語や概念は規定されておらず、副作用と言う語と同等に主作用を語るのは気持ち悪いな。
結局、プログラムにおける一般的な概念はここでは触れてはだめだということですか?
Cもプログラミングなのに。
誰もがその概念に触れた上で副作用について説明してるのに。Cクイックリファレンス第二版でもそう。

78:デフォルトの名無しさん
20/10/09 07:25:51.14 TjErAM+z0.net
職場でのレビューには使えない用語だね
厳格な言葉遣いが要求されるところではダメ

79:デフォルトの名無しさん
20/10/09 07:30:12.69 NuSz27BH0.net
>>78
オライリー本ですらアウトということですか?
逆に、主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられないんだが。

80:デフォルトの名無しさん
20/10/09 07:32:00.31 NuSz27BH0.net
あと、ワッチョイ変えて自演連投してるやろ
過疎スレに急に人が集まるのはおかしい

81:60
20/10/09 07:39:39.09 760t1BpC0.net
別に主作用が値を返すこととは、思っていないから
式は値を返すけど、文は返さない。
関数も返すとは限らない
自動的に、最後に評価された値を返しても、受け取って使うとは限らない。
あまり、主作用を論じることがない
副作用は、C でも使うけど、主に関数型言語のモナド

82:デフォルトの名無しさん
20/10/09 07:41:10.78 TjErAM+z0.net
>>79
そうか、ISO/IEC 9899:2011も見つけられていないんだな
pdfビューアで検索かけても「main effect」はヒットしないぞ
「side effect」は笑っちゃうくらい沢山ヒットするけど

83:デフォルトの名無しさん
20/10/09 07:43:18.14 4a3ez4RS0.net
>>75
こだわってるのはお前じゃん
必死に調査して

84:デフォルトの名無しさん
20/10/09 07:47:01.31 NuSz27BH0.net
>>81
たぶん、君は作用とか状態とかが何を指すかを誤解してるのだと思う。
自分も数日前までは知らなかったけど、もう理解した。

85:デフォルトの名無しさん
20/10/09 07:49:33.79 NuSz27BH0.net
>>82
だから?そんな話はしてない。

86:デフォルトの名無しさん
20/10/09 07:49:48.04 4a3ez4RS0.net
>>80
被害妄想で頑張っちゃうタチなんだね

87:デフォルトの名無しさん
20/10/09 07:51:33.89 NuSz27BH0.net
>>86
図星だったんだね

88:デフォルトの名無しさん
20/10/09 07:54:28.94 4a3ez4RS0.net
>>87
ほらもっと頑張りなよwww

89:デフォルトの名無しさん
20/10/09 08:00:14.18 oLqzRy4la.net
>>80
そういう病的で思い込みが激しいところが反感を買って、突っ込みが多いんだと思うぞ。

90:デフォルトの名無しさん
20/10/09 08:00:39.91 NuSz27BH0.net
はいはい

91:デフォルトの名無しさん
20/10/09 08:09:12.19 TjErAM+z0.net
>>85
> 主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられないんだが。
おまえさん、こう言ったろ?
ISO/IEC 9899:2011はmain effectという概念に触れずにside effectというものを説明してるぞ
おまえさんが見つけられない本を紹介してやったんだよ

92:デフォルトの名無しさん
20/10/09 08:10:10.53 NuSz27BH0.net
>>91
解説書じゃなく規格書だろうに。一般常識なんてわざわざ説明してるわけない。

93:デフォルトの名無しさん
20/10/09 08:11:04.89 NuSz27BH0.net
オライリー本(Cクイックリファレンス第二版)でも、主作用という概念に触れて副作用について説明している。
英語のwikipediaでも当然のように主作用という概念に触れた上で、副作用の説明がなされている。
逆に、主作用という概念に触れずに副作用というものを説明してる本が、今まで見つけられない。
ちなみに、規格書は解説書じゃなんだから、一般常識はいちいち書いてなくて当然。
とりあえず、C言語等の解説書で、副作用について解説がなされている本で、主作用という概念について一切触れられてない本があれば挙げてくれ。
そんな本は、図書館に行って調べたけど、一つも無かったから。もしかしたら、ごく一部にあるのかもしれないけど、まずないから。

94:60
20/10/09 08:16:29.40 760t1BpC0.net
副作用は、Elixir みたいな関数型言語で使うだけ。
パイプライン
Ruby でも、メソッドチェーンする
副作用が怖いから、皆この手の言語では、
状態を持つな、map, map ばっかり言うw

95:デフォルトの名無しさん
20/10/09 08:19:07.63 TjErAM+z0.net
>>92
規格票は公文書だぞ
どこぞの馬の骨が勝手にぬかしてることとは違うんだよ
Cに於ける副作用の定義はここで定められている限りだ

96:デフォルトの名無しさん
20/10/09 08:24:25.86 NuSz27BH0.net
>>95
ようするに、社則に「社員は勤務中に呼吸をしなくてはならない」とは書いてないから、「社員は呼吸禁止」ですか?
オライリー本その他も当然のように触れている、プログラミングの一般常識には、このスレでは触れてはダメということですか?
C言語もプログラミングなのに、プログラミングの一般常識には触れてはだめですか?

97:デフォルトの名無しさん
20/10/09 08:54:49.66 Sv65jxff0.net
少なくとも>69では「触れてはだめ」なんて話はしてないのに、どうしてそんな話になったのか。

98:デフォルトの名無しさん
20/10/09 08:57:01.35 1HKZBnpVM.net
>>91
主たる作用を指す言葉がeffectの場合もある
色々な言い方されてるから文脈から判断するといい

99:デフォルトの名無しさん
20/10/09 09:09:51.23 1HKZBnpVM.net
仕様書のside effectは、sideでないものを念頭に置くからsideという
main的なものが念頭に置かれているのを否定するやつはアホしかいない
それが何かは英wikiのside effectにも書かれてあるじゃないか
次元が低すぎだろ

100:デフォルトの名無しさん
20/10/09 09:39:01.71 TjErAM+z0.net
>>96
日本語でおk

101:デフォルトの名無しさん
20/10/09 09:41:56.88 TjErAM+z0.net
>>99
wikiに頼るほどの次元の低いやつが人のことをアホとか笑っちゃうな
# 俺、wikiのとある記事の筆者なんだがw

102:デフォルトの名無しさん
20/10/09 12:48:32.11 J15OmNAdM.net
副大統領職があるので、正大統領と呼んでも意味は通じるが、普通は言わない。
それだけだ。

103:デフォルトの名無しさん
20/10/09 17:02:12.86 RcOsUEk40.net
ま JIS規格のは「副」作用なんやから 作用(主作用)前提でこそのワードチョイスやん
そこを触れるの嫌がるって無理ありすぎやろ
しまいにはwでファビョる始末

104:デフォルトの名無しさん
20/10/09 17:37:29.96 TjErAM+z0.net
嫌がってねえ
必要性を感じねえつってんだよ
演算と副作用
これだけであらゆる説明ができる
主作用なんかいらねえ

105:デフォルトの名無しさん
20/10/09 18:56:14.04 Jq2CJneE0.net
暇なスレだなぁ

106:デフォルトの名無しさん
20/10/09 20:19:54.00 O/EjtfR6a.net
char型配列初文字で初期化して
printfしたらフフフだ
わからん

107:デフォルトの名無しさん
20/10/09 21:08:22.64 NuSz27BH0.net
質問があります。
副作用とは何ですか?

108:
20/10/09 21:59:11.19 GYOgwMU+0.net
式について
「(式が持つ)値」vs「副作用」
の対立概念だと思っていました、こういうのは lisp がやりはじめたんじゃないでしょうか?

109:デフォルトの名無しさん
20/10/10 01:05:22.78 AL04749p0.net
将来AR関連の仕事につきたいんですけど、初めての言語はCってどうなんでしょうか?

110:デフォルトの名無しさん
20/10/10 05:02:23.82 BjcbKuib0.net
Java入門・初心者質問スレ Part.10
スレリンク(tech板:686番)
上に書いたけど、
YouTube で有名な雑食系エンジニア・KENTA は、
AI をやりたいからと言って、Python から始めてはいけないと言ってる。
初心者が進む道を、サーバー側言語のRuby → Go を王道としてる
Ruby以外の言語から始めると、挫折確率が高い。
ほとんどの学校も、Ruby on Rails ばっかり
Rubyの女神・女優の池澤あやかも言ってる。
大学生がプログラミングを嫌いになるのは、授業でC をやるから
C/C++ などのポインタ系言語は、たいてい挫折する。
ほとんどのテスト時間を、ポインタの追跡に使ってしまって、しょーもないから

111:デフォルトの名無しさん
20/10/10 07:30:36.51 tajpvl710.net
シェルスクリプトが一番実用性が高い。

112:デフォルトの名無しさん
20/10/10 08:34:32.00 sA7w+t8zK.net
>>106
char型配列が s[] だとして、
printf()に s[0] とか *s を渡してないか?

113:デフォルトの名無しさん
20/10/10 16:25:14.09 i5KfYhU+0.net
>>109
ハゲめ

114:デフォルトの名無しさん
20/10/10 18:03:01.19 NSofC8xCa.net
>>112
strで渡しました。
すみません""で囲ったら
出力されました。
一文字ずつ' 'の方法は
なぜかだめだな

115:デフォルトの名無しさん
20/10/10 19:43:45.13 THhanVwl0.net
char str[] = "unko";
printf("%s", "str");
これで何か出力されたとして
それは目的通りなのか?

116:デフォルトの名無しさん
20/10/10 21:20:02.75 yhyq5Xqm0.net
可変長マクロ、... や __VA_ARGS__ に関連して、カンマが自動削除されたり
する使用は、結局、統一した仕様はあるのでしょうか?
__VA_OPT(,) を使う流儀と、カンマを自動削除する流儀、
実引数に , を書いた場合と書かなかった場合の違いなど、
色々有って何が標準か分かりません。

117:デフォルトの名無しさん
20/10/10 21:36:11.71 yhyq5Xqm0.net
#define aaa(fmt, ...) g(fmt __VA_OPT__(,) __VA_ARGS__)
の場合、
aaa(x)とaaa(x,)でどちらも結果は同じ g(x) になるのでしょうか?
そもそも、VC++では、
#define bbb(fmt, ...) g(fmt , __VA_ARGS__)
としていても、
bbb(x)とbbb(x,)でどちらも結果は同じ g(x) になるのでしょうか?

118:はちみつ餃子
20/10/10 22:10:07.34 i9YWGOdm0.net
>>72
その本を持ってないから前後の文脈はわからんけど、引用部分に関して言えば正しいよ。
「式の評価のときに副作用が起きることもある」というのは正しい。
でも、仮に「式の評価のときに値を得られる他に起きることが副作用である」と言ったら間違いだ。
C では実行環境の状態を変化させることを副作用と定義するのであって、
式評価のときに主作用 (式から値にする操作を仮にそう呼ぶとして) の他に
副作用も起こるというのは定義に付随する性質なわけ。
(C における) 副作用とは何かの「定義」に主作用という概念は絡まないんだ。
式を評価する以外の方法 (主作用が存在しない) で起こる状態変化も副作用ということになる。

119:デフォルトの名無しさん
20/10/10 23:13:28.82 BjcbKuib0.net
厳密に言えば、++ 演算子を絡めたものは、変数自体を変更してるから副作用
b = a + 1
なら、変数a を変更していないから、副作用はない
だから、Go では副作用を警戒して、
++ 演算子は、単独の文でしか使えない。
組み合わせられない
a++

120:デフォルトの名無しさん
20/10/10 23:46:17.77 xY0iDsv30.net
>>117
標準(C17/18までの時点)では可変長引数マクロが第一引数以外の場合は少なくともひとつの引数が無ければシンタックスエラーになる
C++20で対応が提案(採択)されていて, 併せてCにも同じ仕様で提案されてる
URLリンク(www.open-std.org)

現状で(標準の範囲内で)同じことをするにはかなりトリッキーな方法を使う必要がある
URLリンク(stackoverflow.com)
またはBoost.PreprocessorのBOOST_PP_VA_OPTが上記提案の__VA_OPT__の代替として使える

121:デフォルトの名無しさん
20/10/11 00:07:40.75 yV/54YAK0.net
>>118
相変わらず、的外れなことを言ってるなあ。
もう相手するのがめんどくさいわ。

122:デフォルトの名無しさん
20/10/11 00:21:33.30 yV/54YAK0.net
君はたぶんスレを保守してる人なんだろうけどさあ、
その話はHNをわざわざ使ってる君のプライドを守るためだけの話になってるので、ここで話し合う意味がないんだよね。

123:デフォルトの名無しさん
20/10/11 00:30:42.60 u/XktDCx0.net
相手するのがめんどくさい、プライドを守るためだけ
おまいうwww

124:デフォルトの名無しさん
20/10/11 00:45:20.99 y5Dl22i00.net
ここに書き込んでいる人って、暇ですることが無い人ばかりではなかったか?

125:デフォルトの名無しさん
20/10/11 00:48:15.50 yV/54YAK0.net
HNをわざわざ使ってる人は必ず、批判されるとHNを使わずに自演するんだよね。
上の書き込みが自演かどうかは知らんけど、自演は必ずする。
大昔にローカルの掲示板をやってたことがあるから、HNを使う人のこの習性はよくよく知ってる。
一人残らずそうやってた。

126:42
20/10/11 00:54:48.93 Oo+TUOYr0.net
>>42
一部誤っていたので訂正。
6.5.16 Assignment operators
3
An assignment operator stores a value in the object designated by the left operand.
An assignment expression has the value of the left operand after the assignment, but is not an lvalue.
The type of an assignment expression is the type the left operand would have after lvalue conversion.
The side effect of updating the stored value of the left operand is sequenced after the value computations of the left and right operands.
The evaluations of the operands are unsequenced.
なので代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」が正しかった。

127:デフォルトの名無しさん
20/10/11 00:55:54.98 y5Dl22i00.net
HNをNGに登録し、レス書いた奴ごとアボーンすると比較的すっきりする

128:デフォルトの名無しさん
20/10/11 01:44:57.79 yV/54YAK0.net
>>126
意訳すれば「代入式の値は、左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき。返されるものは、左辺と同じ(値と型が)」
まあ端的に言うと、左辺が返されてると理解しとけばいいね。

129:デフォルトの名無しさん
20/10/11 07:57:55.20 Oo+TUOYr0.net
>>128
「左辺へ代入後に取り出してたら処理が無駄に重くなるから、代入直前の値を返すべき」なんて書いてない
脚注に
> 111) The implementation is permitted to read the object to determine the value but is not required to, even
when the object has volatile-qualified type.
とはあるが, どう実装すべきなどとは書いていないのだから, それは意訳ではなくお前の意見だ

130:デフォルトの名無しさん
20/10/11 08:44:36.55 yV/54YAK0.net
>>129
いやく【意訳】
《名・ス他》原文の語句の一つ一つにこだわらず、全体の意味に重点をおいて訳すこと。その訳。

131:デフォルトの名無しさん
20/10/11 09:21:01.70 yV/54YAK0.net
あと、そういうなら、君の書いた
>代入式の値は「左辺式(left operand)に右辺式(right operand)の値を代入した後の値を右辺値(rvalueの意味)として評価した値」
これだって君の意訳で意見だよね。
言葉は通じるためにある。ネット検索しても、世間一般的にも代入のことは副作用と呼んでるよね。
副作用を検索すれば「代入」という言葉が頻出する。
なので「The side effect of updating the stored value of the left operand」⇒ 代入 となる
次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
つまり、「代入は最後に行われる」とは読めないかな? よって、返す値はその前に原則的に決まってるということ。
なので「代入した後の値を」という表現は違和感あるし、ワタスの代入直前の方が正解に近くはないかな?
まあ、ワタスは、C言語の超初心者なので、君の挙げてくれた英文を周辺状況と合わせて普通に読んでるだけだけども。
そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。

132:デフォルトの名無しさん
20/10/11 09:24:54.54 1n9mnEAt0.net
>>120
ご返答有難うございます。
やはり、色々と複雑なようですね。

133:デフォルトの名無しさん
20/10/11 12:23:08.94 kZXFoyze0.net
>>125

134:デフォルトの名無しさん
20/10/11 15:19:35.65 Ryz1amqZK.net
>>114
>一文字ずつ' 'の方法
その場合は最後に'\0'が必要

135:デフォルトの名無しさん
20/10/11 16:59:31.64 Oo+TUOYr0.net
>>131
阿呆かな?
>>128>>126の原文中に無く脚注で書かれている内容だしその脚注にも「左辺へ代入後に取り出してたら処理が無駄に重くなるから」などとは書かれていない
> 次に、「(代入) is sequenced after the value computations of the left and right operands.」を訳すると「代入は両オペランドの値を処理後に行われる」となる。
> つまり、「代入は最後に行われる」とは読めないかな?
正しい
> よって、返す値はその前に原則的に決まってるということ。
妄想
規格ではunspecified (実装の自由度)
> そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
逆だろ, 処理系を指定しないなら規格に従うしかない。

136:デフォルトの名無しさん
20/10/11 17:27:29.04 yV/54YAK0.net
>>135
全部反論になってなくて、相手の言ってる言葉を都合のいいように解釈してるだけだね。

137:デフォルトの名無しさん
20/10/11 17:45:12.56 0ARGcdMRM.net
反論できないことは全部反論になってないで片付けるタイプ

138:135
20/10/11 17:51:10.03 jw/lLa/Ba.net
>>136
出先からで済まんな
妄想で仕様書を改竄する言い訳にはならんから注意しな

139:デフォルトの名無しさん
20/10/11 17:52:06.99 yV/54YAK0.net
全然反論になってないし、第一、第一声が「阿呆かな?」と頭に血が昇ってる人の相手しても意味ないじゃん。

140:デフォルトの名無しさん
20/10/11 18:39:36.02 u/XktDCx0.net
意味ないのに書き込んじゃうのはなんでだろうね?

141:デフォルトの名無しさん
20/10/11 19:03:18.63 yV/54YAK0.net
結局、原則的には、返す値は代入前に決まってるよね。gccもVC++もそうみたいだし。

142:デフォルトの名無しさん
20/10/11 19:54:22.88 vwOca/6s0.net
> > そもそも論だけど、仕様書のことを述べても、実装がその通りになってるとは限らないから意味ないよね。
> 逆だろ, 処理系を指定しないなら規格に従うしかない。
同感

143:デフォルトの名無しさん
20/10/11 20:21:00.36 qb0SAJQcM.net
まぁ過去の恨みで絡むのはやめとこうな
非建設的すぎる

144:デフォルトの名無しさん
20/10/11 21:19:40.64 qb0SAJQcM.net
一般論と規格の噛み合わない話が続いてるな
例えば日本語を表すのは大抵の処理系でshift jisかunicodeだが
一般論としてshift jisかunicodeだというと
規格として規定されてないみたいな
お互いの話してる主語が違ってて噛み合わない

145:デフォルトの名無しさん
20/10/11 21:45:50.38 /f4IUzXt0.net
>>144
下段の喩えが分かりませぬ。

146:デフォルトの名無しさん
20/10/12 17:32:23.08 Fn8G8w4j0.net
ファイルオープンできない
visualstudioにてfopen_s
err = fopen_s(&fp,"test.txt","r");

147:デフォルトの名無しさん
20/10/12 17:53:16.57 941JO02hF.net
FILE *fp;
なら
err = fopen_s(fp,"test.txt","r");

148:デフォルトの名無しさん
20/10/12 18:26:02.48 YDN8KrDa0.net
URLリンク(qiita.com)
>>146
これ?

149:デフォルトの名無しさん
20/10/12 20:07:04.33 XcjAzDTUM.net
初心者にありがちなのは相対パスを理解してなくてファイルが無いから開けないってやつ

150:デフォルトの名無しさん
20/10/12 20:19:27.43 UculHi610.net
>>146
それじゃファイル開けないよ
第二引数にファイルパス指定してくださいクソが

151:デフォルトの名無しさん
20/10/13 19:59:14.31 NHAZjg2T0.net
初歩的な質問で大変恐縮ですが、
平成6年度基本情報技術者試験のC言語について質問がありまして、
URLリンク(www.rs.kagu.tus.ac.jp)
問2のCですが、答えが2つありませんか?
ウでもエでもどちらでも正解の気がします。
コンパイルして両方の回答で試してみましたが、問題なく動きます。
なぜ答えがウになってエではいけないのか、どなたか知恵を貸していただけませんでしょうか?

152:デフォルトの名無しさん
20/10/13 20:23:51.05 FgDiRT1ia.net
146です。パス入力しデバッグしたら
なにかわけわからんBOX
でてきて思い通りになりません。

153:デフォルトの名無しさん
20/10/13 22:42:18.30 ciG+8HNI0.net
グローバル変数として宣言した変数j0とj1がmathcalls.hにもあるようで、コンパイルするとエラーが出ます
ヘッダファイルを書き換えずに回避するにはどうすればいいですか?
よろしくお願いします

154:デフォルトの名無しさん
20/10/13 22:43:11.29 b7C863zx0.net
>>151
エだと、60文字目と61文字目が' 'の行があるときに余分な改行が入る

155:デフォルトの名無しさん
20/10/14 01:03:48.89 9cyhkhnyp.net
モバイルC[C/C++コンパイラ]というアプリケーションを使っています
do~while()文で1!+2!+…+n!が1000を超える最初のnの値を求める問題です
以下の画像のどこが間違ってるか教えて頂きたいです
URLリンク(i.imgur.com)

156:デフォルトの名無しさん
20/10/14 01:22:34.34 6pvowPnvM.net
どうなって欲しくてどうなってしまうかくらい書け

157:デフォルトの名無しさん
20/10/14 02:05:50.62 9cyhkhnyp.net
14と表示されてほしいのですが実行すると以下の画像のようになります
URLリンク(i.imgur.com)

158:デフォルトの名無しさん
20/10/14 03:22:45.65 GZXcc9JpM.net
>>151
出題者が想定していた回答から察するに、「正しい答えを選べ」=「最適なものを選べ」という題意なんだろうね。
「エ」の場合、009~012が必ず実行される。
「ウ」の場合、空白が連続していない場合のみ、009~012が実行される。
なので「エ」よりも「ウ」の方が、実行時のコードが少なくなる可能性≒処理速度が速い≒より最適化されている。
ということで、「エ」を排しても「ウ」が選ばれるべき理由は説明できるけど、その逆は説明できそうになさげ

159:デフォルトの名無しさん
20/10/14 05:08:01.62 GZXcc9JpM.net
>>155
モバイルCのことは、よく知らないのだけど。
11行目を削除するか、↓のようにコメントアウト(行頭に // を追加)してみるとか。
// int fact(int n);
>>157
「1!+2!+…+n!が1000を超える最初のnの値」が「14」ということなのかな。
1!+2!+3!+4!+5!+6!=873
1!+2!+3!+4!+5!+6!+7!=5913
ということで(14ではなく)7あたりが正解であるように思える、なんとなくだけどね

160:デフォルトの名無しさん
20/10/14 05:26:43.66 z5Uy/Vd30.net
画像でコードを見せられても、テストできない
paiza.IO などに書いて下さい!

161:デフォルトの名無しさん
20/10/14 06:30:51.16 8SMXEVrO0.net
>>154
>>158
回答ありがとうございます。
よくわかりました!

162:デフォルトの名無しさん
20/10/14 10:47:06.71 ssGc8zMA0.net
>>151
クソみたいなマルチポスト野郎だな
俺らはこういうゴミに手を貸してたのか
騙された気分だ
C言語について質問です。平成6年度基本情報技術者試験のC言語につ... - Yahoo!知恵袋
URLリンク(detail.chiebukuro.yahoo.co.jp)

163:デフォルトの名無しさん
20/10/14 11:51:52.20 +mJN3MGTM.net
>>155
URLリンク(file3-d.kuku.lu)
#include <stdio.h>
int fact(int n){
  if(n==1)return 1;
  return n*fact(n-1);
  }
int main(void){
  int n=1,a=0;
  while( (a+=fact(n)) <= 1000 ) n++;
  printf("%d", n);
  }
普通に7って出たけど?
URLリンク(file3-d.kuku.lu)

164:デフォルトの名無しさん
20/10/14 13:06:19.00 8/BbynCKp.net
>>163
試したら7になりました、ありがとうございます


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch