2012-10-24 3 views
4

우리는 오늘 프로그래밍 교훈을 얻었습니다. 콘솔에서 매우 쉬운 운동. 나는 char에 의해 char에 의해 getchar()에 의해 할당 된 루프를로드 할 것을 썼다.조건에서 할당을 사용하는 것이 안전합니까? C/C++, C#

char c; 
while((c = getchar()) != '\n'){ 
... 

누군가가 C/C++에서 나는이 작업을 수행 할 수 있지만 C#으로 할 수있는, 다른 사람이 말한다, 이것은 사용하는 것이 안전 아니라고 말한다.

나는이

string s; 
if((s = Console.ReadLine()) != ""){ 
... 

을 시도하지만이 또한 작동하므로이 안전하지 않은 이유를 이해하지 않습니다. 그렇지 않습니까?

편집 : \ 나는 또한이 Why would you use an assignment in a condition? 읽을 수 있지만 이는 전혀 내 질문에 대답하지 않습니다.

+0

두 번째 경우는 "\ n"또는 ""이어야합니다. – Omkant

+0

해당 문과 일치하지 않습니다. – asawyer

+0

왜 이것이 안전하지 않을 수 있다는 의문이 있습니까? – besworland

답변

2

샘플의 주요 작업은 할당이 아닌 !=입니다.

if (s = "") 
... 

여기서 문제는 그것이 일반적인 연산자 == 동일 매우 유사하다는 것이다 : 당신은 C#으로 할 수없는 (그리고 나는 그것이 올바른 디자인 결정이라고 생각) 무엇 이 같은 것입니다. 이 코드가 의도적 인 경우가 있지만 일반적으로 찾기가 매우 어려운 오타입니다. 이와 비교 : 당신은 당신의 코드에서 버그를 찾을 때

if (s == "") 
... 

, 당신은 쉽게 간과 할 수 있습니다.

+0

그는 가독성이 아닌 안전에 대해 묻고 있습니다. 코드의 안전하지 않은 측면 (이 경우 "안전하지 않은"은 특정 입력에 대해 올바르게 작동하지 않으며, 실제로 무한 루프가 발생 함을 의미합니다)은 char에'int '를 할당한다는 사실입니다 ','int'가 취할 수있는 어떤 값들은'char'에 들어 가지 않습니다. –

+0

다행스럽게도 현대의 C++ 컴파일러는'if (s = "")'를 encoutter 할 때 경고를 내고'if ((s = ""))'를 제안합니다. – arnoo

3

하나는 코드의 가독성에 대해 주장 할 수 있습니다 (그리고 내가 작업 한 대부분의 장소에서 코드 검토를 통과하지 것이다) 그러나 문제는 할당이 있다는 사실 없습니다. 문제는 getchar()char을 반환하지 않으면 int을 반환한다는 것입니다. 그리고 가능한 반환 값 집합은 char에 맞지 않습니다. 당신이 당신의 코드 를 변경하는 경우 :

int c; 
while ((c = getchar()) != EOF && c != '\n') { 
... 

는 "안전한"것입니다 (하지만 난 여전히 유지 싶지 않을 것이다).

for (int c = getchar(); c != EOF && c != '\n'; c = getchar()) { 
... 

이 적어도 읽을 수 있습니다 : 당신 루프 제어에 c의 갱신을 원하지 않는 경우 for 루프를 사용합니다.

+0

'getchar()'의 반환이 char에 저장된다는 사실은 조건에서 할당을 수행 한 대부분의 장소에서 코드 검토를 통과하지 못했습니까? 나는 그것이 이전의 것이라면 놀랄 것입니다, 상당히 일반적인 관행 인 것 같습니다. – Mike

+0

@Mike Both,하지만 내가 생각했던 것은 조건부에서의 과제였습니다. 하나 이상의 문장을 처리하는 단일 문장은 일반적으로 코드를 읽기가 어렵게 만듭니다. (반면에 많은 곳은 IO의 단일 경우에 대해 부작용에 대한 예외를 만들 것이고'while (std :: getline (...)) '과 같은 것은 광범위하고 관용적이며, –

+0

'for' 루프 버전은 C에서 불법입니다.'while' 루프 버전을 선호합니다. –

관련 문제