0

これが C コードなのか C++ コードなのかはわかりませんが、問題ではないと思います。

このコードでは:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))));

t = u とはどういう意味ですか? t を u に割り当てていませんか?前の行で実際に別の値に設定されているため、意味がありません。

t = exp(a1*log(x)+b1*log(1.-x) + afac);
u = err/t;
x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))));
if (x <= 0.) x = 0.5*(x + t);
if (x >= 1.) x = 0.5*(x + t + 1.);
4

7 に答える 7

8

t = u とはどういう意味ですか?

これは、より大きなサブ式の一部です。

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))

t を u に割り当てていませんか?

いいえ、その複雑な式の値を に代入していますt。その割り当ての結果は、完全な式で使用されます。

x -= (t = <stuff> );

概念的には、これは次と同じです。

t = <stuff>
x = x - t

前の行で実際に別の値に設定されているため、意味がありません。

率直に言って、一連のステートメント全体は私には意味がありません。いずれにせよ、t1 行目で設定され、2 行目で使用され、3 行目で再度設定されます。

于 2012-04-05T14:05:12.467 に答える
7

非常に単純に:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))));
|     |   \_____________________________________/|
|     |        Calculate this monstrosity        |
|     \_________________________________________/|
|                   Assign it to t               |
\________________________________________________/
                  Subtract that from x

C (および C に似た言語) では、代入の「結果」を他のことに使用できます。たとえば、次のようになります。

x = (a = a - 1);   // decrements a and assigns that to x as well
x += (a = 1 - a);  // toggles a between 1 and 0 and adds to x (x increases
                   //   every second time).

C標準の関連ビットは次のC11, 6.5.16 Assignment operators, paras 2 and 3とおりです。

2/ 代入演算子は、左オペランドとして変更可能な左辺値を持つものとします。

3/ 代入演算子は、左オペランドで指定されたオブジェクトに値を格納します。代入式には、代入後の左オペランドの値がありますが、左辺値ではありません。代入式の型は、左側のオペランドが修飾された型を持たない限り、左側のオペランドの型です。修飾された型の場合は、左側のオペランドの型の非修飾バージョンです。左オペランドの格納された値を更新する副作用は、左オペランドと右オペランドの値の計算の後に順序付けられます。オペランドの評価は順不同です。

于 2012-04-05T14:07:58.360 に答える
2

C と C++ の両方で、割り当ては値、つまり左辺の値を返します。

a = 1 + (b = 4);

次と同等です。

b = 4;
a = 1 + b;

そう:

x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))));

以下と同じです:

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))));
x -= t;
于 2012-04-05T14:03:48.363 に答える
1

あなたのコードで:

  x -= (t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x)))));

仮定させてください

  A=(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))));

次に、そのコードは次のようになります

  x -= (t = u/A);

次に、次のように読み取ることができます。

  t = u/A;
  x -= t;

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2012-04-05T14:09:43.350 に答える
0

Using = will indeed assign a value, and will return the value you are assigning. In your case, t is being assigned the result of u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))).

于 2012-04-05T14:07:18.393 に答える
0

全体の計算 :u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))))が割り当てられt、その値が何であれt、これが実行されます。

x=x-t
于 2012-04-05T14:07:46.747 に答える
0

ステートメントは 2 つのサブステートメントに分割できますが、読みやすくするために、おそらく分割する必要があります。

t = u/(1.-0.5*MIN(1.,u*(a1/x - b1/(1.-x))));
x -= t;

基本的に、作成者は、後で使用するために、式全体のサブセクションを中間変数 (t) に割り当てました。

于 2012-04-05T14:09:37.557 に答える