3

我使用以下逻辑来测试三角形是等腰、等边、不等边还是直角。

if (side1 == side2 || side2 == side3 || side1 == side3)
    printf("Isosceles triangle.");
else if (side1 == side2 && side2 == side3 && side3 == side1)
    printf("equilateral triangle");

我将边 3 3 3 的输出作为等腰而不是等边,但是当我交换首先编写等边逻辑的逻辑时,我得到等边。我不明白发生了什么事?

4

5 回答 5

4

你不应该else在这种情况下使用。

代码:

if (condition)
     code
else if (condition2)
     code2

检查条件是否为真。如果是这样,它会执行代码。只有当条件为假时,才会检查条件2并执行code2

于 2013-07-11T13:14:30.780 回答
3

if只有当第一个if为假时,您的代码才会“检查”第二个。
从逻辑上讲,只有当第一个为真时,第二个 if 才能if为真......

我会将代码更改为:

if (side1 == side2 || side2 == side3 || side1 == side3)
{
    printf("Isosceles triangle.");
    if (side1 == side2 && side2 == side3 && side3 == side1)
        printf("equilateral triangle");
}
于 2013-07-11T13:22:16.433 回答
2

else仅在未执行时才if执行。只需删除else,它就可以在这种情况下打印这两个语句。

于 2013-07-11T13:15:29.340 回答
2

side1 = 3, side2 = 3, side = 3,也就是说side1 == side2为真。这就是你的程序打印出“Iosceles”的原因。因为第一个如果是真的,第二个不会被检查。只有第一个是假的。

于 2013-07-11T13:17:17.073 回答
1

只需切换 if 语句的顺序。因为每个等边三角形都是等腰的,所以你永远不会把它变成 elseif。使您的代码如下所示:

if (side1 == side2 && side2 == side3 && side3 == side1)
    printf("Equilateral triangle");
else if (side1 == side2 || side2 == side3 || side1 == side3)
    printf("Isosceles triangle.");

或者,如果要打印两个结果,可以将等边 if 块嵌套在等腰 if 块内:

if (side1 == side2 || side2 == side3 || side1 == side3){
    if (side1 == side2 && side2 == side3 && side3 == side1){
        printf("Equilateral triangle");
    }
    printf("Isosceles triangle.");
}

要考虑的另一个优化是您的等边检查只需要两次检查相等。IE:

(side1 == side2 && side2 == side3) => (side1 == side3)

所以,if 语句可以这样写:

if (side1 == side2 && side2 == side3)
于 2013-07-11T13:30:38.713 回答