C 언어에서 연산자 우선순위(operator precedence)는 표현식 내에서 항들이 어떻게 묶이는지를 결정하고, 표현식이 평가되는 순서를 정합니다. 모든 연산자의 우선순위가 같은 것은 아니며, 예를 들어 곱셈 연산자는 덧셈 연산자보다 높은 우선순위를 가집니다.예를 들어 x = 7 + 3 * 2;라는 코드에서 x에는 20이 아니라 13이 할당됩니다. 곱셈 연산자(*)가 덧셈 연산자(+)보다 우선순위가 높기 때문에 먼저 3 * 2가 계산된 후, 그 결과에 7이 더해지기 때문입니다.아래 표에서는 우선순위가 가장 높은 연산자가 맨 위
C 언어 학습이나 필기 시험 문제를 풀다 보면 printf() 문 안에 증감 연산자(++)가 포함된 코드를 만나는 경우가 많습니다. 이런 유형의 문제는 코드의 출력 결과를 예측하는 능력을 테스트하기 위해 자주 출제됩니다. 이 글에서는 대표적인 예제를 통해 printf() 함수가 인수를 어떤 순서로 평가하는지 살펴보고, 정확한 출력 결과를 이해해 보겠습니다.예제 코드#include<stdio.h> int main() { volatile int x = 20; printf(&quo
이번 글에서는 프로그램 내에서 어떠한 종류의 연산자도 사용하지 않고 두 숫자의 합을 출력하는 방법을 알아보겠습니다.이 문제는 다소 까다로운 편입니다. 이를 해결하기 위해 우리는 printf() 함수의 최소 폭 지정(minimum width field) 기능을 활용할 것입니다. 예를 들어, printf()를 사용해 Hello라는 문자열 앞에 x개의 공백을 삽입하고 싶다면 아래와 같이 작성할 수 있습니다. printf()는 폭(width) 값과 출력할 문자를 차례로 인자로 받으며, 여기서는 공백 문자를 출력하게 됩니다.예제 코드#inc
삼항 연산자(ternary operator)는 조건 연산자(conditional operator)라고도 불립니다. 이 연산자를 사용하면 특정 조건을 검사하고, 그 결과에 따라 다른 작업을 수행할 수 있습니다. 물론 삼항 연산자를 사용하지 않고 if-else 문으로도 동일한 기능을 구현할 수 있습니다.대부분의 경우 삼항 연산자와 if-else 문은 같은 결과를 만들어냅니다. 하지만 일부 상황에서는 if-else 문을 사용할 수 없고, 반드시 삼항 연산자를 사용해야 하는 경우가 존재합니다. 대표적인 예가 바로 상수 변수(constant
C++에서 숫자를 출력할 때 자릿수를 맞추기 위해 앞에 0(선행 0, leading zero)을 붙여야 하는 경우가 종종 있습니다. 하지만 숫자 값 앞에 직접 0을 입력하면 컴파일러가 이를 모두 무시하고 실제 숫자만 출력하기 때문에 원하는 형태의 결과를 얻을 수 없습니다.setw()와 setfill()의 기본 개념C 언어에서는 printf의 형식 지정자(format specifier) 옵션으로 이 문제를 해결할 수 있지만, C++에서는 iomanip 라이브러리를 사용해 출력 스트림을 훨씬 간편하게 조작할 수 있습니다. 이 라이브러리
C++ 프로그램은 실행될 때 명령줄을 통해 외부로부터 값을 전달받을 수 있습니다. 이렇게 전달되는 값들을 명령줄 인자(command line arguments)라고 부릅니다. 코드 내부에 값을 직접 하드코딩하는 대신 프로그램 실행 시점에 외부에서 동작을 제어하고 싶을 때 매우 유용하게 활용됩니다.main() 함수의 argc와 argv명령줄 인자는 main() 함수의 매개변수를 통해 처리됩니다.argc(argument count): 프로그램에 전달된 인자의 총 개수를 나타냅니다. 단, 프로그램 이름 자체도 하나의 인자로 계산되므로 실
이 글에서는 C++ 코드에서 네임스페이스(namespace)를 사용하는 방법에 대해 알아보겠습니다.네임스페이스가 필요한 이유먼저 일상적인 예시를 들어보겠습니다. 같은 반에 자라(Zara)라는 이름을 가진 학생이 두 명 있다고 가정해 봅시다. 이 두 사람을 구분하려면 이름 외에 추가 정보가 반드시 필요합니다. 예를 들어 사는 지역이 다르다면 지역명으로, 아니라면 부모님의 성함 등으로 구분할 수 있겠죠.C++ 프로그래밍에서도 똑같은 상황이 발생할 수 있습니다. 예를 들어 여러분이 작성하는 코드에 xyz()라는 함수가 있는데, 사용하려는
C++ 프로그래밍에서 원의 넓이나 삼각 함수 계산 등을 할 때 PI(π, 파이) 값이 필요한 경우가 자주 있습니다. 다행히 C++에서는 별도로 값을 정의하지 않아도 표준 라이브러리에서 제공하는 PI 상수를 바로 사용할 수 있습니다.PI 상수는 어디에 있나요?PI 상수는 <cmath> 헤더 파일에 M_PI라는 이름으로 정의되어 있습니다. 이 헤더 파일을 포함하기만 하면 매크로 형태의 상수를 그대로 활용할 수 있습니다.헤더 파일: #include <cmath>상수 이름: M_PI값: 약 3.1415926535897
C나 C++에서 main 함수는 겉모습만 놓고 보면 다른 일반 함수들과 크게 다르지 않습니다. 그래서 다른 함수에서 쓰이는 기능들을 main 함수 안에서도 사용할 수 있어 보입니다. 아래 예제에서는 main() 함수를 재귀적으로 호출해 숫자를 역순으로 출력하는 과정을 살펴봅니다. 예제 코드 #include <iostream> using namespace std; int main () { static int x = 10; cout << x-- << en
C++에서 난수(random number)를 생성하는 방법을 알아보겠습니다. 이 글에서는 0부터 특정 값까지의 범위에서 난수를 생성하는 방법을 다루며, 예제 프로그램에서는 상한값을 100으로 설정했습니다.난수 생성을 위해 C 표준 라이브러리에 포함된 srand() 함수를 사용합니다. 이 함수는 void srand(unsigned int seed) 형태로 선언되며, rand() 함수가 사용하는 난수 생성기의 시드(seed) 값을 초기화하는 역할을 합니다.srand() 함수의 선언void srand(unsigned int seed)sr
C/C++에서 숫자 맨 앞에 붙는 0(영)은 해당 숫자가 8진수(octal) 리터럴임을 나타내는 표기법입니다.즉, 실제 숫자 앞에 0을 붙여 쓰면 컴파일러는 그 값을 10진수가 아닌 8진수로 해석합니다. 예를 들어 8진수 25를 표현하려면 025처럼 작성해야 합니다.8진수 리터럴의 기본 규칙숫자 앞에 0을 하나 붙이면 8진수로 인식됩니다.각 자릿수는 0부터 7까지만 사용할 수 있습니다. (8이나 9를 쓰면 컴파일 오류 발생)참고로 0x로 시작하면 16진수, C++14부터는 0b로 시작하면 2진수 리터럴입니다.예제 코드#include
C++에서 i++(후위 증가 연산자)와 ++i(전위 증가 연산자)는 최종적으로 변수 i의 값을 1씩 늘린다는 점에서 결과는 동일합니다. 하지만 동작 순서에는 중요한 차이가 있습니다.i++ (후위 증가): 현재 값을 먼저 사용(할당)한 뒤, i의 값을 1 증가시킵니다.++i (전위 증가): i의 값을 먼저 1 증가시킨 뒤, 증가된 값을 사용(할당)합니다.아래 예제 코드를 통해 그 차이를 직접 확인해 보겠습니다.예제 코드#include<iostream> using namespace std; int main() {
C++ 프로그램을 실행할 때 명령줄에서 프로그램으로 값을 전달할 수 있습니다. 이렇게 전달되는 값을 명령줄 인수(command line arguments)라고 하며, 프로그램을 외부에서 제어하고 싶을 때 특히 유용합니다. 설정값이나 옵션을 코드에 직접 하드코딩하지 않고도 실행 시점에 동적으로 지정할 수 있기 때문입니다.argc와 argv의 역할명령줄 인수는 main() 함수의 매개변수를 통해 처리됩니다.argc(argument count)는 프로그램에 전달된 인수의 개수를 나타내며, argv[](argument vector)는 각
복사 생략(Copy Elision)은 복사 회피라고도 불리며, C++에서 가장 널리 사용되는 컴파일러 최적화 기법 중 하나입니다. 이 기법은 프로그램 실행 중 발생할 수 있는 불필요한 객체 복사를 제거하여 성능을 향상시킵니다. 현재 사용되는 대부분의 C++ 컴파일러는 기본적으로 이 복사 생략 기술을 지원하고 있습니다.그럼 예제 코드를 통해 복사 생략이 실제로 어떻게 동작하는지 살펴보겠습니다.예제 코드#include <iostream> using namespace std; class MyClass { public:
C++에서는 같은 스코프(범위) 내에서 동일한 함수 이름으로 여러 개의 정의를 가질 수 있습니다. 이것이 바로 함수 오버로딩(Function Overloading)입니다. 다만 각 함수 정의는 매개변수 목록의 인자 타입 또는 인자의 개수가 서로 달라야 한다는 조건이 있습니다.반환 타입만으로는 오버로딩할 수 없다주의해야 할 점은, 반환 타입(return type)만 다른 함수 선언은 오버로딩할 수 없다는 것입니다. 컴파일러가 함수를 구분하는 기준은 함수 시그니처(signature), 즉 함수 이름과 매개변수 목록이기 때문입니다.함수
이번 글에서는 C++의 RTTI(Runtime Type Information, 런타임 타입 정보)에 대해 알아보겠습니다.RTTI란 무엇인가?RTTI는 프로그램이 실행 중(runtime)일 때 객체의 실제 자료형(data type)에 대한 정보를 노출해 주는 메커니즘입니다. 이를 활용하면 컴파일 시점이 아닌 실행 시점에 객체의 정확한 타입을 판별할 수 있습니다.다만 중요한 조건이 있습니다. RTTI 기능은 해당 클래스에 최소 하나 이상의 가상 함수(virtual function)가 존재할 때만 사용할 수 있습니다. 즉, 다형성(pol
C++에서 함수를 호출할 때 여러 개의 인자를 전달하는 경우가 많습니다. 이때 한 가지 궁금증이 생길 수 있습니다. 함수 매개변수는 어떤 순서로 평가될까? 왼쪽에서 오른쪽으로 평가될까요, 아니면 오른쪽에서 왼쪽으로 평가될까요?평가 순서 확인 방법매개변수의 평가 순서는 간단한 프로그램을 통해 직접 확인할 수 있습니다. 아래 예제에서는 증가 연산자(++)가 적용된 인자들을 함수에 전달하고, 출력 결과를 통해 각 매개변수가 어떤 순서로 평가되었는지 파악합니다.예제 코드#include<iostream> using namespac
이 글에서는 GCC(GNU Compiler Collection)를 사용하여 C 또는 C++ 소스 코드에서 어셈블리 코드를 생성하고 확인하는 방법을 알아봅니다.GCC는 소스 코드를 컴파일하는 과정에서 발생하는 모든 중간 결과물을 확인할 수 있는 강력한 기능을 제공합니다. 전처리기 출력, 어셈블리 코드, 오브젝트 파일 등 각 단계별 산출물을 손쉽게 검토할 수 있는데, 그중 어셈블러 출력을 얻으려면 -S 옵션을 사용하면 됩니다.이 옵션을 사용하면 컴파일이 완료된 후, 어셈블러로 전달되기 직전 단계의 어셈블리 코드를 화면에 출력해 줍니다.
C++의 인라인(inline) 함수는 클래스와 함께 자주 사용되는 강력한 개념입니다. 함수가 인라인으로 선언되면 컴파일러는 컴파일 시점에 해당 함수가 호출되는 모든 위치에 함수 코드의 복사본을 직접 삽입합니다. 덕분에 런타임에 실제 함수를 호출하는 과정 없이 코드가 실행됩니다.인라인 함수의 동작 원리인라인 함수에 변경 사항이 생기면, 해당 함수를 사용하는 모든 클라이언트 코드를 다시 컴파일해야 합니다. 재컴파일하지 않으면 컴파일러가 새로운 코드로 교체하지 못하고 기존의 오래된 기능이 그대로 유지되기 때문입니다.함수를 인라인으로 만들
C++에서 부동소수점(float) 또는 double 값이 NaN(Not a Number, 숫자가 아님)인지 확인하려면 isnan() 함수를 사용할 수 있습니다. 이 함수는 cmath 헤더에 정의되어 있으며, C++11부터 표준에 도입되었습니다. 따라서 C++11 이상 버전에서는 별도의 추가 설정 없이 바로 사용할 수 있습니다.isnan() 함수란?NaN은 음수의 제곱근 계산, 0으로 나누기 등 수학적으로 정의되지 않는 연산의 결과로 발생하는 특수한 값입니다. isnan() 함수는 인자로 전달된 값이 NaN이면 true를, 그렇지 않