2013-05-21 1 views
3

한 조건에서 한 가지 일을하는 조건문을 사용하려고하지만 다른 조건이 적용되는 경우 두 가지를 수행하려고합니다.C++ 조건부 연산자에 대한 다중 명령문

는 다음과 같은 고려 : "시간"이 25로 설정되어있는 경우

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

, 올바르게 0으로 "시간"을 설정합니다. "h"를 12로 설정하면 "hour"가 12로 올바르게 설정됩니다.

true 조건과 false 조건 모두에 대해 "Invalid Hour Detected"가 출력되는 것이 문제입니다. 조건이 충족되지 않는 경우에만 출력하고 싶습니다.

본질적으로 조건문에서 한 조건에 대해 두 가지 작업을 수행 할 수 있는지 궁금합니다.

는 또한 시도 :

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

하지만 어느 경우에 cout을 실행하지 않았다. 당신이 정말로이 이렇게 적절한 괄호를 추가하고 할당의 순서와 출력 삽입을 반전 할 경우

+0

이것은 오래 전에 다른 사람에게 일어났습니다. 주문을 전환하고 대괄호를 추가해야합니다. – chris

+0

방법/위치를 정교하게 신경 써야합니까? 나는이 문제점을 찾았고 비슷한 것을 찾을 수 없었다. –

+0

[This] (http://en.cppreference.com/w/cpp/language/operator_precedence) 도움이 될 수 있습니다. – juanchopanza

답변

8

은 (쉼표 연산자를 사용하는 경우, 의 값은 표현이 삭제됩니다 왼쪽) :

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

그러나 내 조언은 이며 코드를 읽을 수있게 만들고 이런 종류의 코딩 스타일을 버리십시오..

+0

@Steve 'Kepano'Eggering, 이것은 내가 얻었던 것입니다. 유형은 최소한 일관성이 있어야합니다. – chris

+0

감사합니다. if/else로 돌아가겠습니다. –

+2

@ Steve'Kepano'Eggering : 현명한 결정 –

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")) 
0

쉼표 연산자는 모든 사업자의 가장 낮은 우선 순위가보십시오. 따라서, 당신의 표현은 다음과 같이 계산됩니다 : 당신은 그룹화 및 쉼표 연산자의 올바른 사용과, 조건식이 표현할 수

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

. 그러나 가능하다면 이것을 if/else 성명으로 표현하는 것이 더 낫습니다. 표현식에서 사용해야하는 경우 함수에 배치하는 것이 좋습니다.

3

한 조건에서 한 가지를 수행하지만 다른 조건이 적용되는 경우 두 가지를 수행하는 조건문을 사용하려고합니다. 조건부 아니다

, 그것은 조건부 표현+입니다. 조건부 문은 가독성의 관점에서 여기에 훨씬 더 적합 할 것입니다 :

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


+ C++ 문장으로 독립 표현의 사용을 허용에서 C를 다음과 같습니다.이것이 결국 괄호를 사용하고 작업 순서를 전환하여 솔루션을 올바른 구문으로 "구속"할 수있는 이유입니다. 이 솔루션의 가독성은 평범한 익숙한 if에 비해 많이 겪습니다.

+0

그건 내가 원래 가지고 있었고, 한 줄로가는 길이 있다면 단지 궁금했다. –

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"; 
} 

물론 새 표준 : 크로노 물건 가능한 경우를 사용한다. 그것은 아름답고 표현력이 뛰어납니다.

관련 문제