5

我正在尝试使用一个条件语句,它在一个条件下做一件事,但在另一个条件适用时做两件事。

考虑以下:

 ( h >= 0 && h < 24 ? hour = h : hour = 0, cout << "Invalid Hour Detected\n")

如果“h”设置为 25,则正确地将“小时”设置为 0。如果“h”设置为 12,则正确地将“小时”设置为 12。

问题是它在真假条件下都输出“检测到无效小时”。我只希望它在不满足条件的情况下输出。

本质上,我想知道是否可以在条件语句中为一个条件做两件事。

也试过:

( h >= 0 && h < 24 ? hour = h : hour = 0 && cout << "Invalid Hour Detected\n")

但这并没有在任何一种情况下运行 cout 。

4

5 回答 5

11

如果你真的想这样做,添加适当的括号并反转赋值和输出插入的顺序(使用逗号运算符时,表达式的值被丢弃):

( h >= 0 && h < 24 ) ? ( hour = h ) : (std::cout << "Invalid Hour Detected\n", hour = 0);

但是,我的建议是让你的代码可读并放弃这种编码风格

于 2013-05-21T18:24:13.043 回答
4

我正在尝试使用一个条件语句,它在一个条件下做一件事,但在另一个条件适用时做两件事。

那不是条件语句,而是条件表达式+。从可读性的角度来看,条件语句在这里会更合适:

if( h >= 0 && h < 24) {
    hour = h;
} else {
    hour = 0;
    cout << "Invalid Hour Detected\n";
}


+ C++ 遵循 C 允许使用独立表达式作为语句。这就是为什么您最终可以通过使用括号和切换操作顺序将您的解决方案“剪裁”成正确的语法。与普通的、熟悉的if.

于 2013-05-21T18:26:27.697 回答
0

尝试

( h >= 0 && h < 24 ? hour = h : (hour = 0 || cout << "Invalid Hour Detected\n"))

或者

( h >= 0 && h < 24 ? hour = h : (hour = 0 & cout << "Invalid Hour Detected\n"))
于 2013-05-21T18:24:30.393 回答
0

逗号运算符在所有运算符中的优先级最低。因此,您的表达式的评估方式如下:

(( h >= 0 && h < 24 ? hour = h : hour = 0), cout << "Invalid Hour Detected\n") 

您可以在条件表达式中表达这一点,并使用逗号运算符进行分组和正确使用。但是,如果可能的话,最好在if/else声明中表达这一点。如果您需要在表达式中使用它,请考虑将其放在函数中。

于 2013-05-21T18:24:56.307 回答
0

好吧,我知道这可能不是您正在寻找的答案,但是如果您稍微重构一下,这将“自然地”被清除。

// Handy as a utility free function (in apt namespace)
bool isValidHour(unsigned int hour) { 
    return hour >= 0 && hour < 24;
}

isValidHour(h) ? hour = h : handleInvalidHour();
//...more

// If this is not in a class then you should pass "hour" as a reference.
void MyClass::handleInvalidHour() { 
    hour = 0;
    cout << "Invalid Hour Detected\n";
}

当然,如果可能的话,你应该使用新的 std::chrono 东西。它可爱而富有表现力。

于 2013-05-21T18:30:13.070 回答