1

我正在尝试获取 3 个数字并从最小到最大打印它们。我当前的 while{} 主体和 while{} 的第二个主体(在底部)在它们位于 main() 时工作​​,但我当前的 while{} 主体不起作用..即使 while{} 的第二个主体(在底部)有效。

基本上我必须同时处理身体。{} 它们都在函数 main() 中工作。只有一个在它自己的函数中工作(第二个在最底部),我需要完整代码中显示的那个才能工作。有任何想法吗???非常感谢您的帮助!

通过不工作,我的意思是控制台只是在输入 3 个整数后等待。

#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;
    }
}

这是第二个 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;

是一个问题,因为您试图在没有中间序列点的情况下两次更改变量的值。你不能这样做 - 这是未定义的行为。

于 2012-10-04T06:35:49.837 回答
2

由于语法错误,第一个不起作用。你应该使用

If (*a > *c)

代替

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

奇怪的是,问题不是函数,而是以 double 而不是 int 扫描和打印的问题。

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 回答