2014-10-17 8 views
3

, 나는 다음과 같은 코드를 충족 : 코드의 기본 기능을 확인해야코딩 스타일은 깨끗한 컴파일 경고 동안

char *strcpy(char *dest, char *src) 
{ 
    unsigned int i; 

    while(dest[i] = src[i])//assignment in condition 
     i++; 

    return dest; 
} 

을하지만, 컴파일러는 그 assignment in condition 경고, 코드의이 부분은 어떤 잠재력을 가지고있다 위험? 이런 종류의 경고가 필요하면 청소해야합니까?

답변

4

모든 종류의 청소해야합니다. ===은 종종 프로그래머 (! 안녕하세요, 파스칼)에 의해 혼동되기 때문에

이 경고는 도입, 당신의 의도가 명시 적으로 대입 표현식 주위에 괄호를 추가하여 진술 할 수있다 :

if ((x = y)) // no warning 
+0

내 경우에는 while ((dest [i] = src [i]))' –

3

아니요,이 문제를 해결할 필요가 없습니다.

경고의 이유는 사람들이 실수로 ==을 의미 할 때 =을 입력하는 경우가 있습니다.

while (response = 'n') 

조건에 할당 값을 테스트 할 과제보다는이 같은 실수가 될 가능성이 더 높습니다, 그래서 컴파일러는 그것에 대해 경고합니다. 당신은 시험에 할당을 포장하여 경고를 침묵 할 수

while ((dest[i] = src[i]) != 0) 

을 다른 한편으로는, 나는 당신이 항상 한 문 경우에도, {} 내부 while 또는 if의 몸을 넣어하는 것이 좋습니다. 또한 i를 초기화해야 Why is it considered a bad practice to omit curly braces?

참조 : 경고

unsigned int i = 0; 
+0

나는 것 둘째 그 조언을. 조건부 내에서 과제를 수행하는 것이 합법적이지만 코드를 읽기가 더 어렵게 만듭니다. 컴파일러 옵티마이 저는 사용자가보다 명확하게 의도 한 경우 동일한 코드를 생성합니다. 수년 (수십 년) 전에 devs는 특정 짧은 손을 사용하여 코드를 최적화하는 데 도움이 될 수있었습니다. 그것은 더 이상 사실이 아닙니다. –

+1

모든 나쁜 습관 중 최악은 "이 문제를 해결할 필요가 없습니다"입니다. 이전의 "성공한"빌드에서 남은 중요하지 않은 경고를 통해 실제 문제를 알 수는 없습니다. – user3125367

+0

그것이 사실일지도 모르지만,이 특정한 것은 몇몇 주목할만한 가양 성을 가지고 있습니다. 일반적인 while (row = fetch_from_db()) 패턴을 생각해보십시오. – Barmar