생기지 않을 곳 같은 곳에 꼭 버그가 있다.

이건 절대 버그가 아니야 하고 믿었던 코드에 버그가 숨어 있다.



스스로 완벽하다고 믿었을 때, 버그가 있다. 자만심은 버그를 낳는다.



가장 간단한 if 문에서 조차 버그가 생길 수 있다.



다음은 내가 다른 사이트에서 적은 글이다.

------------------------------------------------------------------

C 에서 수학과 다른 의미를 가지는 기호가 있죠. 그 중 대표적인게 = , 와 == 입니다. 그래서 둘을 바꾸어 쓰기도 합니다.



#include <stdio.h>
void main(){
int a=1;
if( a= 2) printf( "a 는 2이다 ") ;
a=1;
if( a=! 2 ) printf( "a는 2가 아니다." );
}





이 건 잘못된 코드죠. 의도 한 대로 값이 나오지 않을 것입니다.
첫 번째 if 문은 a =2 라고 의도와 달리 대입연산을 했습니다. 그래서 if(2) 라는 것으로 인식하게 돼죠.
두 번째 if 문은 눈에 잘 안 띠지만 논리적인 버그가 있습니다. 잘 살표보세요.
=! 는 절대 하나의 연산이 아닙니다. 의도한 대로 고치면 != 라는 같지 않다는 하나의 연산을 해주어야 하니다. 따라서 저 식은 if(!2 ) -> if(0) 라는 의도하지 않은 식을 만들어 냅니다.

이를 쉽게 방지하는 방법으로
if( 2==a ) 라고 쓰기도 합니다. 이 경우 if(2 = a ) 라고 잘못사용하게 되면 error 를 유발하여 컴파일러가 알려주게 됩니다.

또, 한가지 방법을 warning 수준을 높이는 방법이 있습니다.
project -> setting 을 선택하면 대화창이 열림
c/c++ 탭에서 Warning Level 을 Level3에서 Level4 로 올리면 이 경우에는 warning 이 if 문에 대해 경고를 해주게 됩니다.

----------------------------------------------------------------



한가지 덧 붙이자면 gcc 에서는 -Wall 이라는 옵션으로 경고 수준을 가장 높이는 방법이 있다.

보통 #defien 을 사용하는 경우는 두가지이다. 하나는 리터럴 상수를 사용하기 위해, 또 하나는 매크로처럼 사용하기 위해.



대부분 책에서는 #define 을 피할 수 있으면 피하라고 나옵니다. #define 은 컴파일러의 영역이 아니라, proprocess (전처리기) 의 영역이기 때문에 버그찾기가 조금 어렵습니다.



예를 들어

#defien PI 3.14

라고 친 후, 다른 쪽에서 버그가 난다면 PI 대한 언급이 없고, 오직 3.14 에 대한 언급밖에 없을 것 입니다. 이 유는 말했다시피, 전처리기까 미리 PI 를 3.14라고 고쳐났으므로 컴파일러는 PI 라는게 있는지 조차모릅니다.



그래서 리터럴 상수를 이용하지 말고, 기호상수를 이용하기를 권합니다.



그래도 사용하게 된다면, 리터럴 상수로 사용할 때는 끝에 ; (세미콜론) 을 빼야 한다는 것을 잊지 마세요.



Macro 로 사용될 때는 조심해야 할 게 있습니다.

#include <stdio.h>
#include <stdlib.h>

#define CIRCLE_AREA(R) (3.1415*R*R)

int main(void)
{

int r = 5;

double area = CIRCLE_AREA(r) ;
printf("%f" ,area);
system("PAUSE");
return 0;
}



처럼 #define 문을 사용한 매크로에 전체 () 괄호를 사용하세요. 이유를 아시리라 믿습니다. 또, CIRCLE_AREA(r++) 같이 증감 연산자를 사용하지 마세요.

이 문제들은 #defien 문이 있는 그래로 바꾸기 때문에 오류가 나타나는 현상입니다. 그래서 대신 inline 을 이용하는 것도 한 방법입니다. 그러나 대부분의 컴파일러가 C95 까지 지원하는 상황이라서, 아직은 사용하기에는 조금 무리가 있어 보입니다.



또, 한가지 #define 문 뒤에 C++ 주석을 붙이지 마세요. 좀 오래된 전처리기를 사용하는 컴파일러에서는 C++ 주석을 인식하지 못 할 수 있습니다.


생기지 않을 곳 같은 곳에 꼭 버그가 있다.

이건 절대 버그가 아니야 하고 믿었던 코드에 버그가 숨어 있다.



스스로 완벽하다고 믿었을 때, 버그가 있다. 자만심은 버그를 낳는다.



가장 간단한 if 문에서 조차 버그가 생길 수 있다.



다음은 내가 다른 사이트에서 적은 글이다.

------------------------------------------------------------------

C 에서 수학과 다른 의미를 가지는 기호가 있죠. 그 중 대표적인게 = , 와 == 입니다. 그래서 둘을 바꾸어 쓰기도 합니다.



#include <stdio.h>
void main(){
int a=1;
if( a= 2) printf( "a 는 2이다 ") ;
a=1;
if( a=! 2 ) printf( "a는 2가 아니다." );
}





이 건 잘못된 코드죠. 의도 한 대로 값이 나오지 않을 것입니다.
첫 번째 if 문은 a =2 라고 의도와 달리 대입연산을 했습니다. 그래서 if(2) 라는 것으로 인식하게 돼죠.
두 번째 if 문은 눈에 잘 안 띠지만 논리적인 버그가 있습니다. 잘 살표보세요.
=! 는 절대 하나의 연산이 아닙니다. 의도한 대로 고치면 != 라는 같지 않다는 하나의 연산을 해주어야 하니다. 따라서 저 식은 if(!2 ) -> if(0) 라는 의도하지 않은 식을 만들어 냅니다.

이를 쉽게 방지하는 방법으로
if( 2==a ) 라고 쓰기도 합니다. 이 경우 if(2 = a ) 라고 잘못사용하게 되면 error 를 유발하여 컴파일러가 알려주게 됩니다.

또, 한가지 방법을 warning 수준을 높이는 방법이 있습니다.
project -> setting 을 선택하면 대화창이 열림
c/c++ 탭에서 Warning Level 을 Level3에서 Level4 로 올리면 이 경우에는 warning 이 if 문에 대해 경고를 해주게 됩니다.

----------------------------------------------------------------



한가지 덧 붙이자면 gcc 에서는 -Wall 이라는 옵션으로 경고 수준을 가장 높이는 방법이 있다.