문제

많은 언어에서 할당은 조건에서 합법적입니다. 나는 이것의 이유를 결코 이해하지 못했습니다. 왜 쓸까요 :

if (var1 = var2) {
  ...
}

대신에:

var1 = var2;
if (var1) {
  ...
}
도움이 되었습니까?

해결책

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

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

그렇지 않으면 쓰여져야합니다

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

다른 팁

함수를 호출하는 것이 더 유용합니다.

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

물론, 당신은 단지 n = foo ()를 넣을 수 있습니다. 별도의 진술에서 (n), 그러나 위의 것은 상당히 읽을 수있는 관용구라고 생각합니다.

종종 오류 감지 등을 포함하는 동작 사슬에 가장 유용하다는 것을 알게됩니다.

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() - 물론, 단지 수표보다는. 즉, 함수가 관리하는 과정에서 단계를 점검 할 수 있습니다. (대부분 내가 작업하는 코드에서, 기능은 조건 사전 검사의 선 또는 기능이 작동하는 데 필요한 메모리 할당 또는 유사한 선을 따라야합니다).

작업을 위해 데이터를 반환하는 함수를 호출하거나 깃발을 반환하여 오류 (또는 수행 한)를 표시하는 경우 유용 할 수 있습니다.

같은 것 :

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();
}

또는 루프 및 반 구조를 사용하십시오.

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

나는 보통 루프와 반 양식을 선호합니다.

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

예를 들어 PHP에서 SQL 데이터베이스 결과를 통해 루핑에 유용합니다.

while ($row = mysql_fetch_assoc($result)) {
    // Display row
}

이것은 다음보다 훨씬 좋아 보인다.

$row = mysql_fetch_assoc($result);
while ($row) {
    // Display row
    $row = mysql_fetch_assoc($result);
}

다른 장점은 GDB 사용 중에 발생합니다. 다음 코드에서 오류 코드는 단일 단계에 있는지 여부를 알려져 있지 않습니다.

while (checkstatus() != -1) {
    // process
}

while (true) {
    int error = checkstatus();
    if (error != -1)
        // process
    else
        //fail
}

이제 단일 단계에서 checkstatus ()의 반환 오류 코드가 무엇인지 알 수 있습니다.

그 이유는 :

  1. 성능 향상 (때로는)

  2. Lesser Code (항상)

예를 들어, 방법이 있습니다 someMethod() 그리고 안에서 if 메소드의 반환 값이 null. 그렇지 않다면 다시 반환 값을 사용하려고합니다.

If(null != someMethod()){
    String s = someMethod();
    ......
    //Use s
}

동일한 방법을 두 번 호출하기 때문에 성능을 방해합니다. 대신 사용 :

String s;
If(null != (s = someMethod())) {
    ......
    //Use s
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top