1

私は3つの数字を取り、それらを最小から最大まで印刷しようとしています。現在のwhile{}の本体とwhile{}の2番目の本体(下部)は、main()にある間は機能しますが、while{}の現在の本体は機能しません。 }(下部)は機能します。

基本的に私は{}体をしなければなりません。これらは両方とも関数main()で機能します。独自の関数で機能するのは1つだけで(2つ目は一番下にあります)、完全なコードに示されているものが機能する必要があります。何か案は???助けてくれてありがとう!

動作しないということは、コンソールが3つのintが入力された後に待機することを意味します。

#include <stdio.h>
#include <stdlib.h>

void sortThree(int *a, int *b, int *c);

int main(int argc, char *argv[])
{
    int a, b, c, hold;

        printf("Please input three numbers\n"
               "with a space between each and then press enter:  ");
        scanf("%lf %lf %lf", &a, &b, &c);

        sortThree( &a, &b, &c);

        printf("\n\n%lf %lf %lf", a, b, c);

    system("PAUSE");
    return 0;
}


void sortThree(int *a, int *b, int *c)
{

    while ((*a>*b)||(*b>*c)||(*a>*c))
    {
         if (*a>*b)
           *b = (*a += *b -= *a) - *b;

         if (*b>*c)
           *b = (*c += *b -= *c) - *b;

         if (*a>*c)
           *c = (*a += *c -= *a) - *c;
    }
}

これは2番目のwhile{}本体です。main()内および独自の関数内で機能します。

   if (*a>*b)
        {
            int hold;
        hold= *a;
        *a = *b;
        *b = hold;
    }

    if (*b>*c)
    {
        int hold;
        hold= *b;
        *b = *c;
        *c = hold;
    }

    if (*a>*c)
    {
        int hold;
        hold= *a;
        *a = *c;
        *c = hold;
    }
4

3 に答える 3

2

左から右への評価順序に頼ることができないため、最初のものは機能しません。表現

*b = (*a += *b -= *a) - *b;

間にシーケンスポイントがない状態で変数の値を2回変更しようとしているため、これは問題です。あなたはそれをすることはできません-それは未定義の振る舞いです。

于 2012-10-04T06:35:49.837 に答える
2

構文が間違っているため、最初のものは機能しません。使用する必要があります

If (*a > *c)

それ以外の

If (a > c)
于 2012-10-04T06:07:24.080 に答える
0

奇妙なことに、問題は関数ではなく、int ではなく double としてスキャンおよび印刷されていました。

scanf("%i %i %i", &a, &b, &c);
sortThree( &a, &b, &c);
printf("\n\n%i %i %i", a, b, c);

これには (少なくとも Code::Blocks では) 問題はありません。私が知る限り、それはうまく機能します!

*b = (*a += *b -= *a) - *b;    
于 2012-10-04T06:40:25.730 に答える