3
#include <iostream>
using namespace std;
int main()
{
    int a, b, c, max;
    cout<<"a="; cin>>a;
    cout<<"b="; cin>>b;
    cout<<"c="; cin>>c;
    a>b?(max=a, a=b, b=max):a;
    b>c?(max=b, b=c, c=max):a;
    a>b?(max=a, a=b, b=max):a;
    cout<<a<<"  "<<b<<"  "<<c;
}

乱数を3つ入力して並べるコードです。ただし、この部分はわかりません:

a>b?(max=a, a=b, b=max):a;
b>c?(max=b, b=c, c=max):a;
a>b?(max=a, a=b, b=max):a;

それはどのように機能し、その理由は何ですか?

a = 6、、、b = 54としましょうc = 12

  1. a>b?(max=a, a=b, b=max):a; <-- max を 6 に設定し、次に a を 54 に設定し、次に 54=max に設定します。次に、6 と 54 を比較しますが、これは false であり、最初の数字として (6) を書き込みますか?

  2. b>c?(max=b, b=c, c=max):a; <-- 最大値を 54、b=12、12=最大値に設定します。次に、54 と 12 を比較しますが、これは私たちの場合は true であり、c=12 を 2 番目の数値として書き込みますか?

  3. a>b?(max=a, a=b, b=max):a; <-- 最大値を 6、a=54、54=最大値に設定します。次に、6 と 54 を比較しますが、これは false であり、再び 6 を書き込みます。wtf?

プログラム自体は正常に動作します。アルゴリズムの仕組みがよくわかりません。

4

4 に答える 4

4

これ:

cond ? A : B

これとほぼ同等です:

if (cond) {
    A;
} else {
    B;
}

これ:

(X, Y, Z)

これとほぼ同等です:

X;
Y;
Z;

つまり、各式は順番に完全に評価されます。

これら 2 つのルールを使用すると、コードの実行を追跡できるはずです。しかし、そのコードはグロテスクであり、決してそのように書かれるべきではありませんでした。したがって、私の推奨事項は、それを無視して、アルゴリズムを適切に記述することです。

于 2012-06-14T00:29:29.537 に答える
2

このコードが行っていることはすべて、1 つのステートメントで値を交換するために複数のことを 1 つにまとめて行うコンマ演算子の機能を悪用していることです。

最初の行は、最初の 2 つの数値の最大値を見つけます。2 番目はその最大値を見つけ、3 番目は 3 つのうち最大のものを見つけます。3 行目は、後で他の 2 つを順番に並べ替えます。

これとほぼ同じです:

if (a > b)
    swap (a, b); //b is max(a,b)
if (b > c)
    swap (b, c); //c is max(max(a,b),c), which is largest
if (a > b)
    swap (a, b); //b is max (a, b), so numbers are in order smallest to largest
于 2012-06-14T00:33:37.680 に答える
2
a>b?(max=a, a=b, b=max):a

最後の ":a" は実際には何もしません。":0" と同じくらい簡単にできます。「a>b」が偽の場合に実行されるのは、本質的にステートメントです。しかし、 a は何にも割り当てられていないため、何もしません。だからこの場合

if(a > b){
    max = a;
    a = b;
    b = max;
}

max 変数を使用して a と b を交換します。次の 2 行では、SAME アルゴリズムが使用されます。だから本質的に

if a > b then swap them
now if b (which could hold a) > c then swap them
now if a (which could hold the older b) > b(which could hold the oldest c) then swap
于 2012-06-14T00:36:54.013 に答える
0

まあ、本質的に私はこれが起こることです。

a>b?(max=a, a=b, b=max):a;

最初のセクションは 3 番目の if ステートメントの形式での通常の比較にすぎないため、基本的に が最初の角括弧セットと等しいかどうかをチェックa>b?、真の場合は最初のセクションを評価し、それ以外の場合は後のコード:は次のようになります。は(max=a, a=b, b=max)基本的に各項目を順番に評価するため、最初maxに に設定されa、次にa = b最後にに設定されb = maxます。他の 2 行についても同様です。

ここで詳細を読むことができます: http://www.cplusplus.com/doc/tutorial/operators/

これが役に立ったことを願っています。

于 2012-06-14T00:36:31.830 に答える