28

次の関数が異なる結果をもたらす理由を誰かが説明できますか? 最初のものはうまくいかないようですが、2番目のものはうまくいきます。+=1 と ++ が同じことをしたと思っていたので、私は困惑しています。

(このコードを実際に使用するつもりはありません。違いを示すだけです)。

/*function 1*/
function incrementIfZero1(base,element) {

    if (element == 0) {
        return base++;
    }
    else
    {
        return base;
    }
};


/*function 2*/
function incrementIfZero2(base,element) {

    if (element == 0) {
        return base+=1;
    }
    else
    {
        return base;
    }
};

incrementIfZero1(1,0) /* -> 1*/
incrementIfZero2(1,0) /* -> 2*/

どんな助けでも大歓迎です。

ありがとう、

ロビン

[編集:]

返信ありがとうございます。今では意味がありません。次のステートメントも試しましたが、関数 1 と同じ結果になりました。

return (base++)

これが関数2と同じ結果をもたらさないことに今驚いています-私は、括弧がそれを「強制的に」評価してから返すことを期待していたでしょう。これが当てはまらない理由は何ですか?

4

8 に答える 8

25

return base++インクリメントされる直前の base の値を返す場合。++baseインクリメントが最初に発生してから返されるようにするためにやりたいこと

それ以外++は同じ+=1

[編集] あなたの編集に応じて、ランダムなステートメントを括弧で囲んでみましたが、ほとんどの数学演算子は期待どおりに応答します。おそらく、事前増分と事後増分の構文が非常に意図的であり、ステートメント自体がかっこで囲むかどうかに関係なく、特定の値を返します

于 2013-06-21T18:22:35.247 に答える
5

あなたは戻ってきてbase++います。これは後置インクリメントであるため、リターン後にインクリメントが処理されます。この特定のケースでreturn ++base;は、正しいでしょう

于 2013-06-21T18:24:14.990 に答える
5
return base++;

ポストインクリメントです。base が保持する値をインクリメントし、インクリメントが発生する前の元の値を返します。

return base += 1;

base に 1 を加算し、base を返します。これはプレインクリメントです。これは、次のように書くこともできます。

return ++base;
于 2013-06-21T18:25:03.790 に答える
3

警告!文字列と数値の 2 つの異なる型が and を使用して変更される場合、違いがあり++ます+=

countが文字列の場合、count += 1型変換を行うようで、2 番目の数値を文字列に変換しcount++ますが、文字列のcount引数を取り、数値に変換し、1 ずつインクリメントします。

let count = process.argv[2]

while (count < 5) {
  console.log('Inside of the loop. Count is', count)
  count += 1 // NOT likely what you want! Now, try it with count++
}

console.log('Outside of loop. Count is', count)

もう一つの例:

> let num = '2'
undefined
> num++
2
> num
3

// VS using +=

> let num2 = '2'
undefined
> num2 += 1
'21'
> num2
'21'
于 2017-12-06T20:19:18.830 に答える
2

少しだけ明確にするために。

「変数 += 1」は、「変数 = 変数 + 1」と同等です。variable++ と同等ではありません!

variable++ のようなものはインプレースで使用できます。前者は代入です。

于 2013-06-21T18:25:55.423 に答える
1

最初の関数では、次のことが起こります。

return base++; // 最初にベース値が返され、次にインクリメントされます。

2番目の機能で:

return base+=1;//ここではインクリメントが最初に行われ、次に変数が返されます。

省略形の割り当ては優先度が高くなります。つまり、その行自体でジョブを終了します

于 2013-06-21T18:26:10.623 に答える
0

注意してください:

x = 1; y = (x++ * 10 + 1);

に等しい :

y = 1 * 10 + 1 = 11

確かに :

x = 1; y = (++x * 10 + 1);

に等しい :

y = 2 * 10 + 1 = 21;

終わる :

++x;

また

x++;

差はありません!

于 2013-06-23T10:38:18.987 に答える