-2

2 番目の初期化が最初の初期化に影響を与えることなく、2 つの異なる関数で変数を 2 回初期化しようとしています。

float X;

void setup()
{
  size(400, 400);
  background(255);
}
void draw() 
{
  Rect1();
  Rect2();
}

void Rect1()
{
  fill(255,0, 0);
  rect(X, 20, 40, 40);
  X=20;
}

void Rect2()
{ 
  fill(0, 255, 0);
  rect(X, 200, 40, 40);
  X=50;
}
4

1 に答える 1

1

あなたのコードは「デモンストレーション」コードのようですが、続行する前にまず座って処理について少し学ぶ必要があることを示す以外に、実際には重要なことは何もしません。チュートリアル。価値がある。

あなたが与えたコードはもっと賢明に書くことができますが、代わりに私は質問に答えます。処理では、Javaのスコープ規則のバリエーションを使用します。ローカル変数はオブジェクトインスタンス変数よりも優先され、グローバル変数よりも優先されます。

int x = 0;
int y = 50;

class Thing {
  int y = 10;    
  Thing() {
    // x is global, y is global and object instance
    println("x (in Thing): "+x);
    println("y (in Thing): "+y);
    declareAndCheck();
  }
  void declareAndCheck() {
    // now we make some local variables: they win.
    int x = 40;
    int y = 100;
    println("x (local declared): "+x);
    println("y (local declared): "+y);
  }
}

void setup() {
  println("x (global): "+x);
  println("y (global): "+y);
  Thing t = new Thing();
  // and global is still global
  println("x (global, again): "+x);
  println("y (global, again): "+y);
}

これにより、次の出力が生成されます。

x (global): 0
y (global): 50
x (in Thing): 0
y (in Thing): 10
x (local declared): 40
y (local declared): 100
x (global, again): 0
y (global, again): 50

なんで?最初にこれを見る:

x (global): 0
y (global): 50

xとyは値0と50のグローバル変数だからです。十分に単純です。次に、次のように表示されます。

x (in Thing): 0
y (in Thing): 10

「Thing」オブジェクトには、オブジェクトインスタンス変数「y」があり、それとグローバル変数の間の名前の競合に勝ちます。

次に、declareAndCheckと入力します。ここで、次のように表示されます。

x (local declared): 40
y (local declared): 100

これで、グローバルxとローカルxがあり、ローカルが常に勝ち、インスタンスyとローカルyがあり、ローカルが常に勝ちます。

最後に、xとyをグローバルコンテキストで再度出力します。競合がないため、次のようになります。

x (global, again): 0
y (global, again): 50

そして、それがあなたにとって意味をなさない場合は、それらのチュートリアルを実行してください、彼らはあなたにProcessingでのプログラミングを教えます=)

于 2013-02-18T03:44:02.123 に答える