布尔表达式似乎合乎逻辑,但不起作用

时间:2018-11-14 12:37:46

标签: c while-loop boolean-expression

我正在C程序中读取3个整数,并将它们存储在int *[]中。但是,在阅读第三个int时,我想将其与前两个进行比较,如果大于两个都比较,则程序结束,如果不是,程序将继续读取第三个。输入直到满足while循环中的条件。

我的问题是,尽管布尔表达式似乎是逻辑上的(至少对我而言),并且我输入的值已成功存储在数组中,但为什么总是跳过while循环?

#include <stdio.h>

int main(void) { // Stelios Papamichail 4020
    int *sides[3];
    int i;
    for(i=0; i < 3; i++) {
        if(i == 2) {// third side
            scanf(" %d",&sides[i]);
            while((sides[i] < sides[i-1]) && (sides[i] < sides[i-2])) {
                scanf(" %d",&sides[i]);
            }
        } else {
            scanf(" %d",&sides[i]);
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:4)

代码中的主要问题是,它调用undefined behavior

在代码中通过说出详细内容

 int *sides[3];

您要定义一个3 int * s的数组(3个指向整数的指针的数组),而您需要的是3 int s的数组。更改为

int sides[3];

也就是说,根据您的要求,如果要检查第三个输入是否最小,则&&条件下的while应该为||

答案 1 :(得分:1)

您说:

  

我正在C程序中读取3个整数,并将它们存储在int * []中。但是,在读取第三个int时,我想将其与前两个int进行比较,如果它大于两个整数,则程序结束,如果不是,则程序将继续读取第三个int。输入,直到它满足while循环中的条件为止。

好吧,int与指针不同。 int允许您执行整数算术,而int *允许您执行指针算术。 (指针存储int变量的内存地址,因此,当您递增变量时,它会将其值移动到 next 地址,这与添加一个地址不同- -因为int需要一个以上的字节才能容纳在内存中)您可以在程序中使用int *(正如您在评论中所说,您的老师已经指出了这一点),但这就像制作煎蛋卷一样但是用苹果代替鸡蛋(好吧,它们都是圆形的,但结果不一样)。我无法猜出您的老师要求您使用int *的原因,但这给了我来自编译器的警告,并提醒我这样做的风险(在FreeBSD上,编译器为CLANG)

  

我的问题是,尽管布尔表达式似乎是逻辑上的(至少对我而言),并且我输入的值已成功存储在数组中,但为什么总是跳过while循环?

好吧,这取决于您尝试检查的内容。首先,您要说的是代码中的将最后一个输入数字与之前的输入数字进行比较,如果大于或等于它们中的任何一个,则再次输入第三个数字 。如果那是您想要的,那是正确的,但是我无法猜出进行这种测试的目的是什么,因此,我唯一可以得出的结论是该测试的编写不正确(主要是因为我要进行的测试)再说)。

关于您的程序的第三条评论是:

如果您需要根据前一个值检查最后一个值,为什么不在循环之外进行检查。这样做不仅使您的代码看起来更简单,而且消除了if (i == 2)测试的需要(您根本不需要在代码中使用i,只需编写:

    for(i=0; i < 3; i++) {
        scanf("%d",&sides[i]); /* you don't need the space before %d */
    }
    while((sides[2] < sides[1]) && (sides[2] < sides[0])) {
        scanf("%d",&sides[2]);
    }

最后,您在一条评论中说,将int *sides[3]更改为int sides[3]会使编译失败。我已经尝试过,只是消除了*只是消除了我从代码编译中收到的三个警告。无法猜测为什么您说它不能与该消除方法一起编译。

注意

您的代码似乎尝试检查三角形的三个边是否允许您构建一个边。如果是这样,正确的检验是第三个三角形大于前边的差并且小于前边的和,这是不是你上面写的。有效的测试应该是:

#define ABS(expr) ((expr) < 0 ? -(expr) : (expr))

while (sides[2] >= sides[1] + sides[0] || sides[2] <= ABS(sides[1] - sides[0])) {
    scanf("%d", &sides[2]);
}

答案 2 :(得分:0)

使用给定大小的数组声明为:

int sides[3];

同时声明一个未知大小的数组(基本上是一个指针):

int* sides;//you should use malloc to allocate the array memory at run time.

使用

int *面[3];

您要声明一个指针数组。

您的最终代码应如下所示:

#include <stdio.h>

int main(void) { // Stelios Papamichail 4020
    int sides[3];
    int i;
    for(i=0; i < 3; i++) {
        if(i == 2) {// third side
            printf("%d %d %d\n", sides[i], sides[i-1], sides[i-2]);

            scanf(" %d",&sides[i]);
            while((sides[i] < sides[i-1]) && (sides[i] < sides[i-2])) {
                printf("%d %d %d\n", sides[i-2], sides[i-1], sides[i]);
                scanf(" %d",&sides[i]);
            }
        } else {
            printf("%d %d %d\n", sides[i-2], sides[i-1], sides[i]);
            scanf(" %d",&sides[i]);
        }
    }
    return 0;
}

我添加了一些照片以了解发生了什么情况。