2013-02-05 2 views
0

예 1 :단일 단계 return 문 또는 다중 단계 return 문

int length() 
{ 
     return strlen(random_string); 
} 

예 2 :

int length() 
{ 
     int str_length = 0; 
     str_length = strlen(random_string); 
     return str_length; 
} 

질문 :
나는 많은 기능 건너 한 곳에 단 한 줄의 코드 그 기능에 대한 요구 사항을 만족시킬 수는 있지만 이런 종류의 지름길을 피하는 것에 대해 생각해 봅니다.

하나가 다른 것보다 적절하거나 더 간단한 코드를 사용해야하는 상황이 있습니까?

+2

괜찮은 컴파일러에서는 아무런 차이가 없어야합니다. 더 읽기 쉽거나 유지 보수가 쉬운 것이 무엇이든 선택하십시오. –

+1

@AndyProwl : NRVO .... –

+0

함수가 여러 작업을 수행하고 구현 변경 가능성이 0이 아닌 경우 여러 줄 문을 사용하는 것이 좋습니다. – Shmiddty

답변

1

이유 중 하나는 당신이 이제까지 길이의 값을 출력하기 위해 줄을 추가하기로 결정하는 경우, 그것은 훨씬 덜 번거 로움이다 :

int length() 
{ 
    const int str_length = strlen(something); 
    printf("str_length = %d\n", str_length); 
    return str_length; 
} 

또는 일부를 추가하려면 추가 어설 :보다

int length() 
{ 
    const int str_length = strlen(something); 
    assert(str_length >= 0); 
    return str_length; 
} 

다른, 모든 당신이 가장 적합한 느낌이 무엇인지에 관하여

+1

당신은'const'를 잊어 버렸습니다! –

2

두 번째 예제는 초기화하지 않아서 아무 이유없이 공간을 차지하기 때문에 결코 가지 않을 것입니다.

int length() 
{ 
    const int str_length = strlen(arbitrary_string); 
    return str_length; 
} 

이 두 가지 이유입니다 :

내가 할 수 하면 다음과 같다

  1. 당신은 당신의 컴파일러는 명명 된 반환 값 최적화를 수행 할 수 있습니다;
  2. 반환 값은 이제 이름이 부여되어 자체적으로 문서화됩니다.

그러나, 나를 위해 기본 규칙의 더. 이 특정한 실제 경우

:

  1. 귀하의 반환 형식은 int 순대 작은, 그래서 명명 된 반환 값 최적화 어쨌든 허용되지 않습니다, 그것은하더라도 크게 의미가 될 것이다;
  2. 이 기능은 이미 사소하고 적절하게 명명되었습니다.

그래서 첫 번째 예제를 사용하는 것 :

int length() 
{ 
    return strlen(arbitrary_string); 
} 
+2

다른 장점 : 코드를 반환하기 전에 코드가 생성하는 값을 볼 때 디버깅을 쉽게 할 수 있습니다. –

+2

예 2는 실제로 NRVO를 방지합니까? "함수가 리턴 값 유형과 동일한 cv-unqualified 유형을 가진 비 휘발성 자동 객체 (함수 또는 catch 절 매개 변수 제외)의 이름 인 경우 클래스 반환 유형이있는 함수의 return 문에서 자동 개체를 함수의 반환 값 " –

+0

"에 직접 작성하여 복사/이동 작업을 생략 할 수 있습니다. @Lightness는 두 번째 코드가 더 최적화 된 다음 첫 번째 코드 또는 두 코드가 모두 동일합니다. ? – Arpit

1

난 항상 훨씬 더 잘 읽고 예 1과 함께 할 것입니다 말. 중간 변수 이름이 가독성을 돕거나 표현식을 여러 문장으로 분리해야하는 경우에만 return 문에 표현식을 넣지 않을 것입니다.

나는 예제 2를 제안하지 않을 것이다. 0으로 초기화하는 것은 무의미하다. 중간 땅이 더 :

int length() 
{ 
    int str_length = strlen(random_string); 
    return str_length; 
} 

그러나 str_length 당신에게 strlen가하는 함수 이름과 더 이상 얘기하지 않습니다 분명하다.

-1

대부분의 경우 가독성이 항상 성능을 뛰어 넘습니다. 성능에 중요한 코드가있는 경우 성능을 위해 이동하십시오. 그러나 이는 예외가 아니라 규칙입니다.

항상 가독성을 높이십시오.

+0

항상 가독성을 위해 예,하지만이 예제에서는 실제로 첫 번째 가독성이 향상되었습니다. 물론 나는 어떤 공간을 차지하기 위해 300 자의 줄을 반환하지 않을 것이다. –

0

일반적으로 코드는 읽기 쉽고 목적을 명확하게해야합니다. 귀하의 예에서는 더 짧은 버전을 선호합니다. 긴 버전의 의미론에 대한 추가 정보는 없습니다.

언제나 예외가있을 수 있습니다. 특히 반환 된 값이 길고 불만스러운 표현으로 인해 발생하는 경우. 그런 다음 중급 결과의 이름을 지정하는 것이 도움이 될 수 있습니다. aa는 여러 단계의 접근 방식을 가지고

0

이 문제의 ALW에 대답하기 위해 [당신은 물론, 따라 엄격한 코딩 표준이없는 경우!] Ays는 읽기 쉬운 솔루션을 선택합니다. 모든 프로그래밍 언어에서 중요하지만 C++에서는 매우 중요합니다.

C++ 개발자에게 가장 쉬운 질문은 옵션 번호 1이며 깨끗하고 간단합니다. 하지만 당신이 작성해야 한 줄 같은 것을 발생하는 경우 : 당신이 지금 무엇을 이해하더라도, 당신은 힘든 시간을 가질 수 있기 때문에이 경우

return (classA *)(function1(data1)->function2())->function3(); 

가에 allways 라인을 분할 선택 미래에 어떤 일이 일어나고 있는지 알아보십시오.

도움이 되길 바랍니다.

+1

그 나쁜 예는 디버깅이 끔찍한 데, 그 이유는 대부분 디버거가 라인 (주로)에서 "생각"하는 경향이 있기 때문입니다. 나는 중간에 중단 점을 둘 수있는 디버거를 보지 못했습니다. –