質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4655閲覧

[C#]代入式の左辺には変数、プロパティ、またはインデクサーを指定してください。と表示される

Brain0628

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2019/01/26 04:44

UNITYでゲーム開発を始めました。
http://nn-hokuson.hatenablog.com/entry/2016/07/09/075441
こちらのサイトを参考に作り「隕石を落下させよう」でC#のスクリプトを作ったのですが
掲題の通り
「代入式の左辺には変数、プロパティ、またはインデクサーを指定してください。」と表示されてしまい何が間違っているのかわかりません。ご教示いただけると助かります。

ちなみにスクリプトの作成はVisual Studio2017で作っています。
一応作成したものも載せておきます。

public class RockController : MonoBehaviour
{
float fallSpeed;
float rotSpeed;

// Start is called before the first frame update void Start() { this.fallSpeed = 0.01f + 0.1f = Random.value; this.rotSpeed = 5f + 3f = Random.value; } // Update is called once per frame void Update() { transform.Translate(0, -fallSpeed, 0, Space.World); transform.Rotate(0, 0, rotSpeed); if(transform.position.y < -5.5f) { Destroy(gameObject); } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

0.01f + 0.1f = Random.value;

こういう代入文はエラーになる、ということはわかるでしょうか


C#も含めて、C言語系の言語では、
A = B = c;
という代入文は、
B = C; を実行(BにCの値を代入)、その結果(Bの値)をAに代入する、という動作となります。

this.fallSpeed = 0.01f + 0.1f = Random.value;

この場合、まず、
0.01f + 0.1f = Random.value;
という式を実行します、が、この式はおかしいです。
0.01f + 0.1fに、Random.valueの値を代入しようとしてますが、これは実行できません。
まさに、

「代入式の左辺には変数、プロパティ、またはインデクサーを指定してください。」

とでている通りのエラーであることがわかりますね

投稿2019/01/26 04:53

編集2019/01/27 05:56
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Brain0628

2019/01/26 04:57

あ!よくみたら「=」と「*」を間違っていることがわかりました。 しかしy_waiwaiさんの質問の意味ははっきりとは理解していません。 A=1 はいいけども A=1=Bはダメということでしょうか?
y_waiwai

2019/01/26 05:01

A=B=C という文は、 A=(B=C) ということです。 ってことで、最初のB=Cのところでコケているってことですね
len_souko

2019/01/27 05:31

質問者さんは、算数や数学の左辺等辺の計算結果が一致するという意味ではなく、右辺の結果が左辺へ代入するという大概のプログラム言語で適用されている文法を知らないんじゃないですか?
Brain0628

2019/01/27 07:42

皆様回答ありがとうございました。 「とりあえずwebサイトに記載されている通りやってみよう」→「=」と「*」を間違って入力(小さいノートPCでやっていたため表示が細かくて間違いました・・・。)→間違いに気付かない状態で「サイトの通りやってるのに何故できない?」と軽くパニック という感じでした。皆様からすれば「そもそも基本の基本」という感じだと思います。お恥ずかしい限りです。今後はWinMerge等を使って細かく間違っていないかチェックしていこうと思います。
len_souko

2019/01/27 14:53 編集

どう読んでもコピペミスをしないように気を付けるとしか書いてない 考えることを放棄したら何もできない 切っ掛けはコピペミスでも、なんでエラーと表示されるのか、なんというエラーなのか、それを >しかしy_waiwaiさんの質問の意味ははっきりとは理解していません。 とあるので全く理解していないから僕もy_waiwaiさんも書いてるのにコピペミスが悪いで思考停止してる 考える気がなさそうだからこんなこと書いても質問者には何の役にも立たないだろうけど、今後誰かが見て役に立つかもしれないので書いておく 左辺にリテラルの値(ソースに直で書いてる値)や定数を書くと代入できない。例えば 10 = 11; と書くと10に11を代入するという意味になるが、これは解釈できない。なんせ10と固定した数値に別の値を割り当てることをやってしまうと今後 a = 10;と書くとaは10なのか11なのかわからない状態になる。なのでコンパイラが文法エラーだよ!って怒る。右辺は変数のように値や状態を保持するための器(大概の本では変数の事を器って書くのでそれに合わせました)でなければ代入できない。 次に A + B = C; これもいけない。仮に A + B = 10;と書いた場合、Aに代入された値はなんなのか、同様にBは?となって確定できない。A = 9 と B = 1 なら良いって?じゃぁ A = 1 と B = 9 になる場合はどうなん?これも良いって?じゃぁこの式を実行した後にAを出力したらなんて表示されるのが正解なん?となると結局コンパイラでは判断できないのでこれも文法エラーとなる。 でもって今回はその両方に当たるのでコンパイラがマジ勘弁と言ってきたってこと
guest

0

  • TL;DR

IDEを正しく使おう
イメージ説明
このように、VisualStudioなら「代入式の左辺には変数、プロパティ、またはインデクサーを指定してください。」がどこについて言われているかピンポイントで教えてくれる。
「赤下線部が代入式の左辺である」、つまり代入の左辺であるはずがない5f+3fが左辺だと言われていることに気付ける(vsのヒントで気付けなかったらプログラミング向いてない)

  • 式の評価

y_waiwai様がおおよそ書いておられるのですが、あらためて。
fallSpeed = 0.01f + 0.1f = xという式は演算子の優先順位=演算子の結合規則でします。
まず、演算子の優先順位のため、+が=より先に計算されます。
従ってfallSpeed = 0.11f = x;
次に=は右結合なので、右にある=が先に評価されて、fallSpeed = (0.11f = x);となります。
こう書くとまず0.11f = xを評価することになりますが、0.11fにxを代入するというのは言葉で考えてもおかしいと分かります。このおかしさがエラーで、「何かを代入できるのは変数だけ」という意味です。

  • カッコを使おう

*=を間違ったとのことですが、*が先に計算されるのはこれも演算子の優先順位です。複雑になるとわかりにくいので、自明だと思ってもカッコをつけてください。冗長なカッコでエラーになることはありません。図のうえの行のように、おかしいところがより特定されていきます。

  • A = B + C = Dのバリエーション

ここまで読んでfallSpeed = 0.01f + x = 0.1fがエラーになることを理解しましょう
また、fallSpeed = 0.01f + (x = 0.1f)がエラーにならないことを理解しましょう
さらに、fallSpeed = 0.01f + (Random.Value = 0.1f)はエラーですが「Random.Valueは読取専用であるため、割り当てできません」というようなエラーが出ることも理解しましょう

  • あらためて

「気をつける」ではバグはなくなりません。ツールを正しく使いましょう。
また、プログラムは書いたとおりにしか動かないので、何を書いたのかを、複合処理は1演算子ずつにばらして書く、カッコをつけるなどして、冗長でも細分化し、「自分が何を書いたのか」を文法に照らして論理的に理解しましょう。

投稿2019/01/28 16:03

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問