インタプリタを作っていて、Rubyの言語仕様を参考にしています。
以下のRubyのコードなんですが
ruby
1a = [1] 2a[0] += a[0] += 1
Rubyではa[0]
の結果が3になります。
この仕様はプログラミング言語全般で、一般的な仕様なんでしょうか?
私が今作っている言語は結果が4になるのですが、これは間違っていると言えますか?
文脈的な解釈としては3も4もどちらも納得できると思うのですが。
結果を3にしたほうがメリットが多いのであれば、そちらの仕様を検討したいです。
>私が今作っている言語は結果が4になるのですが
その言語名とコードを提示してください。
>結果を3にしたほうがメリットが多いのであれば
それは要件次第です。ロジックも何かを実現するための手段の1つに過ぎません。
欲しい結果が違うならロジックを変更するまでです。書いたとおりにしか動かないので・
なぜ言語名とコードが必要なんですか?
Rubyの仕様について聞いています。
でしたら「この仕様はプログラミング言語全般で、一般的な仕様なんでしょうか?」「私が今作っている言語は結果が4になるのですが」というのはなぜ書いたのでしょうか。
実際に比較対象があるのならそこは提示して仕様を比較すべきですし、
気にならない人のほうが少ないと思うのですけど。
先のコメントに書いた通り「書いたとおりにしか動かない」ので、出ている結果が全てです。
どこまで突っ込んで仕様を知りたいのかはこの質問内容からは読み取れませんでした。
質問は編集できますので具体的に記載してください。
現状では何が問題なのかが不明です。
a[0] が元々 2 なら大抵の言語でそうなると思いますが、配列の概念と演算子とわからないのはどちらですか?
この式が何をしているのか自分で説明してみてください。そうしたら回答者はその間違っている部分を正しく把握することができます。
配列のindexが0から始まるか1から始まるかどっちがいいか?みたいな質問なので、どちらを取るか(メリットがあるか)を考えられるのは唯一思想を持っている質問者しかいない気が。
> 私が今作っている言語は結果が4になるのですが、これは間違っていると言えますか?
a[0] が元々 3 ならたいていの言語でそうなると思いますが、この質問のコードだけなら未初期化の変数の値を演算しているので、コンパイルエラーになったり、実行時エラーになったり、デフォルト値を用いたりと、言語によってもコンテクストによっても結果は様々です。
> この質問のコードだけなら未初期化の変数の値を演算しているので
えっと、どこがですか?
> a = [1]
この時点の「a[0]」は「1」
> a[0] += a[0] += 1
は「(a[0] += a[0]) += 1」
丸カッコ内の「a[0] += a[0]」は「a[0] = a[0] + a[0]」
「a[0] = a[0] + a[0]」は「a[0] = 1 + 1」だから
この時点の「a[0]」は「2」
その「a[0]」に「+= 1」すると「a[0]」は「3」になる
…そういう話とは違いますか?「4」になるのはどういう流れですか?
> a[0] += a[0] += 1
は「(a[0] += a[0]) += 1」
言語によっては代入は右結合です。 a[0] += (a[0] += 1) と解釈されます。
すみません丸括弧は
a[0] += (a[0] += 1)
ですね
で丸括弧内で「a[0]」が「2」になっているから
左端の「a[0]」も「2」になっているはずで
だから結果は「4」ということですか?
javascriptだと明示的にカッコを付けても「3」になりました
a = [1]
a[0] += (a[0] += 1)
a[0] //3
> えっと、どこがですか?
a[1] = 1 のように読んでしまいました。
すみません、読み間違いです。
コメントありがとうございます。
C++とRubyでは文脈の解釈が違うんですね。
C# では 3 になります。
PowerShell でも 3 になりました。
読みづらいだけなので、私としてはコンパイルエラーにしてほしいですね。
回答2件
あなたの回答
tips
プレビュー