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



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

我的问题是,尽管bool表达式看起来是合乎逻辑的(至少对我来说(,并且我输入的值成功地存储在数组中,但为什么它总是跳过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;
}

代码中的主要问题是,它调用了未定义的行为。

在你的代码中,通过说来详细说明

 int *sides[3];

您正在定义一个由3个int *s组成的数组(由3个指向整数的指针组成的数组(,而您需要的是一个由三个ints组成的数组。将其更改为

int sides[3];

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

你说:

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

嗯,int与指针不同。int允许您进行整数运算,而int *允许您进行指针运算。(指针存储int变量的内存地址,因此,当您递增它时,它会将其值移动到下一个地址,这与添加一个不同——因为int需要一个以上的字节才能放入内存(您可以在程序中使用int *(正如您在评论中所说,您的老师已经指出了这一点(,但这就像做煎蛋饼,但使用苹果而不是鸡蛋(好吧,它们都是圆的,但结果不一样(。我猜不出你的老师要求你使用int *的原因,但这给了我编译器的警告,告诉我这样做的风险(编译器是CLANG,在FreeBSD上(

我的问题是,尽管bool表达式看起来合乎逻辑(至少对我来说(,并且我输入的值成功地存储在数组中,但为什么它总是跳过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]);
}

给定大小的数组声明为:

int sides[3];

而未知大小的数组(基本上是指针(声明为:

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

使用

int*sides[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 %dn", 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 %dn", sides[i-2], sides[i-1], sides[i]);
                scanf(" %d",&sides[i]);
            }
        } else {
            printf("%d %d %dn", sides[i-2], sides[i-1], sides[i]);
            scanf(" %d",&sides[i]);
        }
    }
    return 0;
}

我添加了一些指纹来了解发生了什么。

最新更新