[variable-assignment] 조건에서 할당을 사용하는 이유는 무엇입니까?

많은 언어에서 할당은 조건에서 합법적입니다. 나는 그 이유를 결코 이해하지 못했습니다. 왜 다음과 같이 작성 하시겠습니까?

if (var1 = var2) {
  ...
}

대신에:

var1 = var2;
if (var1) {
  ...
}



답변

if 문보다 루프에 더 유용합니다.

while( var = GetNext() )
{
  ...do something with var
}

그렇지 않으면 작성해야 할

var = GetNext();
while( var )
{
 ...do something
 var = GetNext();
}


답변

종종 오류 감지 등과 관련된 일련의 작업에서 가장 유용하다고 생각합니다.

if ((rc = first_check(arg1, arg2)) != 0)
{
    report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
    report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
    report error based on new rc
}
else
{
    do what you really wanted to do
}

대안 (조건에서 할당을 사용하지 않음)은 다음과 같습니다.

rc = first_check(arg1, arg2);
if (rc != 0)
{
    report error based on rc
}
else
{
    rc = second_check(arg2, arg3);
    if (rc != 0)
    {
        report error based on new rc
    }
    else
    {
        rc = third_check(arg3, arg4);
        if (rc != 0)
        {
            report error based on new rc
        }
        else
        {
            do what you really wanted to do
        }
    }
}

장기간의 오류 검사를 사용하면 대안은 페이지의 RHS를 벗어날 수 있지만 조건부 할당 버전은 그렇게하지 않습니다.

오류 검사는 단순히 검사가 아닌 ‘작업'( first_action(),,) second_action()일 수도 있습니다 third_action(). 즉, 기능이 관리하는 프로세스의 단계를 확인할 수 있습니다. (대부분 내가 작업하는 코드에서 함수는 사전 조건 검사 줄이나 함수가 작동하는 데 필요한 메모리 할당 또는 유사한 줄을 따라 있습니다).


답변

함수를 호출하는 경우 더 유용합니다.

if (n = foo())
{
    /* foo returned a non-zero value, do something with the return value */
} else {
    /* foo returned zero, do something else */
}

물론, n = foo (); 별도의 진술에서 if (n), 그러나 위의 내용은 상당히 읽기 쉬운 관용구라고 생각합니다.


답변

작업 할 데이터 또는 오류를 나타내는 플래그 (또는 완료)를 반환하는 함수를 호출하는 경우 유용 할 수 있습니다.

다음과 같은 것 :

while ((c = getchar()) != EOF) {
    // process the character
}

// end of file reached...

개인적으로 나는 그다지 좋아하지 않는 관용구이지만 때로는 대안이 더 추악합니다.


답변

GCC는 실수로 과제를 진실 값으로 사용하려고 시도하는 경우 (-Wall 사용) 감지하는 데 도움이 될 수 있습니다.

if ((n = foo())) {
   ...
}

즉, 추가 괄호를 사용하여 이것이 실제로 원하는 것임을 나타냅니다.


답변

관용구는 문 while대신 루프를 작성할 때 더 유용 if합니다. 를 들어 if당신이 설명하는대로 문, 당신은 그것을 분리 할 수 있습니다. 그러나이 구조가 없으면 자신을 반복해야합니다.

c = getchar();
while (c != EOF) {
    // ...
    c = getchar();
}

또는 loop-and-a-half 구조를 사용하십시오.

while (true) {
    c = getchar();
    if (c == EOF) break;
    // ...
}

나는 일반적으로 루프 앤 하프 형식을 선호합니다.


답변

짧은 대답은 표현식 지향 프로그래밍 언어가 더 간결한 코드를 허용 한다는 것입니다 . 명령을 쿼리에서 분리 하도록 강요하지 않습니다 .