C ++中的三元条件运算符问题

时间:2019-09-02 08:09:19

标签: c++ integer ternary-operator

我的目标:输入两个整数,并对所有从小数到大数的整数求和。

#include <iostream>
int main() {
    int v1, v2;
    std::cout << "Enter two integers: " << std::endl;
    std::cin >> v1 >> v2;

    int big, small;
    big = v1 > v2 ? v1, small = v2 : v2, small = v1;

    int sum = 0;
    for (int i = small; i <= big; i++)
        sum += i;
    std::cout << "The sum is " << sum << std::endl;

    getchar();
    getchar();
    return 0;
}

我要测试三元条件运算符,而不是使用if语句。

当v1小于或等于v2时,例如

Enter two integers: 
1
5
The sum is 15

结果很好。

但是当v1> v2时,结果是错误的。

Enter two integers: 
5
1
The sum is 0

我不知道为什么。 有人可以解释吗?

2 个答案:

答案 0 :(得分:6)

您需要在逗号运算符的每一侧交换术语,因为big将被分配列表中的最后一个。您还需要添加括号以使其正确评估:

big = (v1 > v2) ? (small = v2, v1) : (small = v1, v2);

请参阅说明here

  

在逗号表达式E1, E2中,对表达式E1进行求值,其   结果被丢弃[...]逗号表达式的结果的类型,值和值类别恰好是第二个操作数E2

的类型,值和值类别

此外,如果您希望它简短易读,则可以考虑以下方法:

std::cin >> big >> small;
if (small > big)
    std::swap(big, small);

答案 1 :(得分:2)

big = v1 > v2 ? v1, small = v2 : v2, small = v1;

这没有达到您的期望。 当使用逗号运算符,分隔多个表达式时,结果表达式将获得这些表达式中最后一个的值。因此,在您的情况下,如果为v1 > v2big分配了值:

 v1, small = v2

small = v2的值,它变成v2而不是您想要的v1。因此,您最终在v1 > v2时给两个数字分配了相同的值!

您可以使用单独的语句:

big = v1 > v2 ? v1 : v2;
small = v1 < v2 ? v1 : v2;