C 언어에서 연산자란 무엇인가?
연산자(Operator)는 하나 이상의 객체(피연산자)에 적용되는 연산을 나타내는 기호입니다. 연산자는 주로 표현식(expression)에서 의미를 가지지만, 선언문에서도 사용될 수 있습니다. 일반적으로 영숫자가 아닌 특수 문자들로 이루어진 짧은 시퀀스 형태를 띱니다.
예를 들어 a + b에서 +는 두 값을 더하는 산술 연산자이며, x && y에서 &&는 논리곱을 수행하는 연산자입니다.
구두점(Punctuator)이란?
구두점(Punctuator)은 요소들의 목록을 분리하거나 종료하는 데 사용되는 기호입니다. 코드의 구조를 구분하고 컴파일러가 프로그램의 각 부분을 인식할 수 있도록 돕는 역할을 합니다.
C 언어의 연산자 및 구두점 목록
C 언어에서 사용되는 연산자와 구두점은 다음과 같습니다.
... && -= >= ~ + ; ]
<<= &= -> >> % , < ^
>>= *= /= ^= & - = {
!= ++ << |= ( . > |
%= += <= || ) / ? }
## -- == ! * : [ #연산자와 구두점으로 중복 사용되는 기호
일부 기호는 상황에 따라 연산자로도, 구두점으로도 사용된다는 점에 유의해야 합니다. 대표적인 예로 *, =, :, #, ,가 있습니다.
*: 곱셈 연산자로도 쓰이고, 포인터 선언 시에는 구두점 역할을 합니다.,: 쉼표 연산자로도 쓰이고, 함수 인자나 변수 목록을 구분하는 구두점으로도 쓰입니다.
쌍으로 사용해야 하는 구두점
여러 구두점은 반드시 짝을 이루어 사용해야 합니다. 여기에는 다음이 포함됩니다.
( )— 소괄호: 함수 호출, 조건식 등[ ]— 대괄호: 배열 첨자 접근{ }— 중괄호: 블록 또는 초기화 목록
토큰 파싱 규칙: 최장 일치 원칙
컴파일러가 입력 텍스트를 해석할 때는 가능한 한 가장 긴 시퀀스를 하나의 토큰으로 만들려고 시도합니다. 이를 최장 일치(longest match) 원칙이라고 합니다.
예를 들어 a+++++b를 파싱할 때, 컴파일러는 다음과 같이 인식합니다.
a ++ ++ + b → 유효하지 않은 구성
컴파일러는 다음과 같이 해석하지 않습니다.
a ++ + ++ b → 이 경우 유효할 수 있음
즉, 개발자가 의도한 방식과 다르게 해석될 수 있으므로, 증감 연산자를 연속해서 사용할 때는 공백이나 괄호를 통해 의도를 명확히 하는 것이 좋습니다.