1. #define문이 치환 리스트가 수식일 경우, 반드시 그 수식을 괄호 ()로 묶어 주어야 한다.
그래야만 나중에 그 매크로가 다른 수식 내에서 전개될 때에도 연산순위에 관계없이
올바른 결과를 가져온다.
예) #define ISPPER (c >= 'A' && c <= 'Z')
#define NEXTMACRO (CURRENTMACRO - PREVMACRO)
2. 매크로명은 관례적으로 대문자를 쓴다. 반대로 매크로명이 아닌 변수명, 함수명, 키워드 등등은
관례적으로 소문자로 쓴다. C 프로그래머는 대부분 하나의 명칭에 대문자와 소문자를
섞어 쓰는 일을 극력 피하고 있다.
예) int antinum; (O) int AntiNum; (X)
<설명> C에만 해당하는 것이며 C++, 비주얼C, JAVA에서는 다른 규칙이 적용됩니다.
이는 변수와 상수(매크로 상수 포함)를 한눈에 구분하며 생산성과 관련한 것으로 봅니다.
즉, 대소문자가 번갈아 사용되면 타자할 때 쉬프트를 눌러야 할 일이 많아서
코딩 속도가 떨어지며 만일 대문자로 정의된 것을 소문자로 호출한다든지
그 반대의 경우 서로 다른 변수나 함수로 간주되어 문제가 발생할 소지가 많아집니다.
또한 int AntiNum; 으로 선언해놓고 Antinum = a; 라고 대입한다면 두 변수는 다른 변수가 되는 것이죠.
3. 한 변수가 어떤 함수의 실매개변수로 두 번 이상 쓰이면 절대로
이 변수에 증감 연산자를 사용하지 않는다. 대입연산자도 마찬가지다.
printf("%d, %d", x/2, x++); <-- 이런 경우는 피해야 한다.
4. 한 변수가 수식 내에서 두 번 이상 쓰이면 절대로 이 변수에 증감 연산자를 사용하지 않는다.
대입연산자도 마찬가지다.
x / 2 + x++ <-- 이런 수식은 극력 피해야 한다.
5. 관계 연산자 양변의 데이터형은 가급적 일치해야 한다. 상등 연산자도 마찬가지이다.
6. 양변의 데이터형이 피치 못할 사정으로 서로 다를 수 밖에 없다면 가급적 어느 한 쪽 변에
캐스트 연산자를 써서 양변의 데이터형을 손수 일치시켜 주어야 한다.
예) int i; float t; i = (int)(t / 2.);
7. char형 변수에는 그래픽 문자를 절대 대입하지 않는다. 즉, char형은 -1과 0~127의 값만 가지도록 제한해야 한다.
8. 그래픽 문자는 unsigned char 형으로 취급한다.
<설명> 그래픽 문자라는 것은 unsigned char 의 값이 128이상 255이하의 값을 갖는 것을 말합니다.
영문모드에서 그 각각의 문자를 찍으면 외곽선 같은 도형의 모습이 찍힙니다.
7. 8. 과 같이 했을 때에 한해 unsigned char형 변수와 char,형 을 대소 비교할 경우,
캐스트 연산자로 구태여 변환하지 않아도 올바른(상식적인) 결과를 얻을 수 있다.
9. 조건 연산자의 첫번째 피연산자가 수식일 때에는, 연산순위에 따라 괄호가 필요없더라도
읽기 좋도록 하기 위해 괄호로 묶어준다. 이 관례에 따르면 조건 연산자의 서식은 아래와 같다.
(expr1) ? expr2 : expr3
단, expr1이 하나의 변수이거나 하나의 함수일 때에는 괄호를 사용하지 않는 것이 보통이다.
예) x = condition ? 100 : 10;
yes = yesno() ? 1 : 0;
10. 가급적이면 조건 수식 안에 중첩하여 다시 조건 수식을 사용하지 않는다. 어쩔 수 없이 사용해야 할 경우, 결합순서에 따라서 괄호가 필요 없더라도 프로그램을 읽기 좋게 괄호를 사용한다.
단, 한가지 예외로 아래와 같은 경우는 괄호를 사용하지 않는다. 괄호를 사용하면 수식이 더 복잡해지기 때문이다.
valuable = (expr1) ? expra :
(expr2) ? exprb :
...
(exprn) ? expry :
exprz;
11. 비트 연산자 <<와 >>는 가급적 부호없는 형의 데이터에만 사용하도록 한다.
12. sizeof 연산자의 피연산자에는 가급적 괄호를 쓴다.
13. 가능하면 정수형 <-> 문자형 변환을 제외하고는 캐스트 연산자를 써서 형변환을 분명하게 밝혀주는 것이 좋다.
예) int형 함수이고 x가 double형일 때
return -1; <-- 캐스트 연산자를 쓸 필요가 없다.
return 'A'; <-- 캐스트 연산자를 쓰지 않아도 된다.
return (int)x; <-- 캐스트 연산자 (int)를 가급적 쓰도록 한다. 이 때 x는 double형이지만 정수 내의 값이어야 한다.
14. return문에 지정하는 수식은 관례상 괄호로 묶는다.
예) return (n * 2 / 4);
return (sin(x) / 2);
return (x - 1);
단, 하나의 변수, 하나의 상수, 하나의 함수나 변수에 단항 연산자만을 쓸 경우에는 괄호를 사용하지 않는다.
예) return result;
return EOF;
return 0;
return getch();
return -1; <--- 단항 연산자 -만 쓴 경우
return s[3];
return structure.member[3];
<발췌편집> 임인건, 터보C 정복, 도서출판 가남사, 1990년