🎯 컴파일 언어인 Cμ–Έμ–΄μ˜ 문법에 λŒ€ν•΄ μ •λ¦¬ν•©λ‹ˆλ‹€.


πŸ“— Today I Learned

μ—°μ‚°μž

μ—°μ‚°μžλŠ” 정적인 데이터듀을 유기적으둜 ν–‰λ™ν•˜κ²Œ ν•˜μ—¬ μƒˆλ‘œμš΄ κ°€μΉ˜λ₯Ό μ°½μΆœν•΄λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

μ‚°μˆ  μ—°μ‚°μž

  • + : μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ— μžˆλŠ” 값을 λ”ν•©λ‹ˆλ‹€.

  • - : μ™Όμͺ½μ˜ κ°’μ—μ„œ 였λ₯Έμͺ½μ˜ 값을 λΊλ‹ˆλ‹€.

  • * : μ™Όμͺ½κ³Ό 였λ₯Έμͺ½μ˜ 값을 κ³±ν•©λ‹ˆλ‹€.

  • / : μ™Όμͺ½μ˜ 값을 였λ₯Έμͺ½μ˜ κ°’μœΌλ‘œ λ‚˜λˆ•λ‹ˆλ‹€.

  • % : μ™Όμͺ½μ˜ 값을 였λ₯Έμͺ½μ˜ κ°’μœΌλ‘œ λ‚˜λˆ„μ–΄ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.


λŒ€μž… μ—°μ‚°μž

  • = : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ 였λ₯Έμͺ½μ— μžˆλŠ” 값을 μ™Όμͺ½μ— λŒ€μž…ν•©λ‹ˆλ‹€.

  • += : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ κ°’κ³Ό 였λ₯Έμͺ½ 값을 λ”ν•œ ν›„ λ‹€μ‹œ μ™Όμͺ½μ˜ 값에 λŒ€μž…ν•©λ‹ˆλ‹€.

  • -= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ κ°’μ—μ„œ 였λ₯Έμͺ½μ˜ 값을 λΊ€ ν›„ λ‹€μ‹œ μ™Όμͺ½μ˜ 값에 λŒ€μž…ν•©λ‹ˆλ‹€.

  • *= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ κ°’κ³Ό 였λ₯Έμͺ½ 값을 κ³±ν•œ ν›„ λ‹€μ‹œ μ™Όμͺ½μ˜ 값에 λŒ€μž…ν•©λ‹ˆλ‹€.

  • /= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값을 였λ₯Έμͺ½ κ°’μœΌλ‘œ λ‚˜λˆˆ ν›„ λ‹€μ‹œ μ™Όμͺ½μ˜ 값에 λŒ€μž…ν•©λ‹ˆλ‹€.

  • %= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값을 였λ₯Έμͺ½ κ°’μœΌλ‘œ λ‚˜λˆˆ ν›„ 남은 λ‚˜λ¨Έμ§€λ₯Ό λ‹€μ‹œ μ™Όμͺ½μ˜ 값에 λŒ€μž…ν•©λ‹ˆλ‹€.


증감 μ—°μ‚°μž

  • ++a : a의 값을 1 μ¦κ°€μ‹œν‚¨ ν›„ 연산을 μ§„ν–‰ν•©λ‹ˆλ‹€.

  • a++ : 연산을 μ§„ν–‰ν•œ ν›„ a의 값을 1 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

  • --a : a의 값을 1 κ°μ†Œμ‹œν‚¨ ν›„ 연산을 μ§„ν–‰ν•©λ‹ˆλ‹€.

  • a-- : 연산을 μ§„ν–‰ν•œ ν›„ a의 값을 1 κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.


관계 μ—°μ‚°μž

  • == : 두 κ°’μ˜ 값이 κ°™μŠ΅λ‹ˆλ‹€.

  • != : 두 κ°’μ˜ 값이 λ‹€λ¦…λ‹ˆλ‹€.

  • > : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값이 였λ₯Έμͺ½μ˜ 값보닀 ν½λ‹ˆλ‹€.

  • < : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값이 였λ₯Έμͺ½μ˜ 값보닀 μž‘μŠ΅λ‹ˆλ‹€.

  • >= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값이 였λ₯Έμͺ½μ˜ 값보닀 ν¬κ±°λ‚˜ κ°™μŠ΅λ‹ˆλ‹€.

  • <= : μ—°μ‚°μžλ₯Ό κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ˜ 값이 였λ₯Έμͺ½μ˜ 값보닀 μž‘κ±°λ‚˜ κ°™μŠ΅λ‹ˆλ‹€.


논리 μ—°μ‚°μž

  • ! : ν”Όμ—°μ‚°μžμ˜ κ²°κ³Όλ₯Ό λͺ¨λ‘ λ°˜λŒ€λ‘œ λ§Œλ“­λ‹ˆλ‹€.

  • && : ν”Όμ—°μ‚°μžκ°€ λͺ¨λ‘ μ°Έμ΄μ–΄μ•Όλ§Œ trueλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.

  • || : ν”Όμ—°μ‚°μž λ‘˜ 쀑에 ν•˜λ‚˜κ°€ 참이면 trueλ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.




λΆ„κΈ°λ¬Έ

if문

μ£Όμ–΄μ§„ 쑰건이 true일 λ•Œλ§Œ λ‚΄λΆ€μ˜ μ½”λ“œ 블둝을 μ‹€ν–‰ν•˜λŠ” μ‘°κ±΄λ¬Έμž…λ‹ˆλ‹€.

if(μˆ˜ν–‰ 쑰건) {
  μˆ˜ν–‰ν•˜κ³  싢은 일 
}

if - else문

  • μ£Όμ–΄μ§„ 쑰건이 true이면 if 블둝 λ‚΄λΆ€μ˜ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
  • μ£Όμ–΄μ§„ 쑰건이 falseλ©΄ else 블둝 λ‚΄λΆ€μ˜ μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
if(μˆ˜ν–‰ 쑰건) {
  μˆ˜ν–‰ 쑰건 만쑱 μ‹œ μˆ˜ν–‰
} else {
  μˆ˜ν–‰ 쑰건 뢈만쑱 μ‹œ μˆ˜ν–‰
}

if - else if문

  • 첫 번째 쑰건(μˆ˜ν–‰ 쑰건1)이 true이면 ν•΄λ‹Ή μ½”λ“œ 블둝이 μ‹€ν–‰λ©λ‹ˆλ‹€.

  • μˆ˜ν–‰ 쑰건1이 false이고, else if λ’€μ˜ μˆ˜ν–‰ 쑰건2κ°€ true라면 ν•΄λ‹Ή 블둝이 μ‹€ν–‰λ©λ‹ˆλ‹€.

  • λͺ¨λ“  쑰건이 false일 경우 else 블둝이 μ‹€ν–‰λ©λ‹ˆλ‹€.

if(μˆ˜ν–‰ 쑰건) {
  μˆ˜ν–‰ 쑰건1 만쑱 μ‹œ μˆ˜ν–‰
} else if(μˆ˜ν–‰ 쑰건2) {
  μˆ˜ν–‰ 쑰건2 뢈만쑱 μ‹œ μˆ˜ν–‰
} else {
  μˆ˜ν–‰ 쑰건1, μˆ˜ν–‰ 쑰건2 뢈만쑱 μ‹œ μˆ˜ν–‰
}



반볡문

while문

반볡 쑰건을 λ§Œμ‘±ν•˜λŠ” λ™μ•ˆ 반볡 λ¬Έμž₯을 μˆ˜ν–‰ν•˜κ³ , 쑰건을 λ§Œμ‘±ν•˜μ§€ μ•ŠμœΌλ©΄ while문을 λΉ μ Έ λ‚˜κ°‘λ‹ˆλ‹€.

while(반볡 쑰건) {
  반볡 λ¬Έμž₯
}

이쀑 whileλ¬Έ

while λ¬Έ μ•ˆμ— 또 λ‹€λ₯Έ while 문이 λ“€μ–΄κ°€λŠ” ν˜•νƒœλ₯Ό 이쀑 while문이라고 ν•©λ‹ˆλ‹€. ν•˜λ‚˜μ˜ 반볡문이 μ‹€ν–‰λ˜λŠ” λ™μ•ˆ λ‚΄λΆ€μ˜ λ°˜λ³΅λ¬Έλ„ ν•¨κ»˜ μ‹€ν–‰λ©λ‹ˆλ‹€.

while(반볡 쑰건) {
  반볡 λ¬Έμž₯1
  while(반볡 쑰건2) {
    반볡 λ¬Έμž₯2
  }
}

for문

for 문은 반볡 νšŸμˆ˜κ°€ μ •ν•΄μ Έ μžˆμ„ λ•Œ μ‚¬μš©ν•˜λŠ” λ°˜λ³΅λ¬Έμž…λ‹ˆλ‹€.

for(초기문; 쑰건문; 증감문) {
  반볡 λ¬Έμž₯
}
  • 초기문: λ°˜λ³΅μ„ μ‹œμž‘ν•˜κΈ° 전에 μ‹€ν–‰λ˜λ©°, 보톡 λ³€μˆ˜μ˜ μ΄ˆκΈ°κ°’μ„ μ„€μ •ν•©λ‹ˆλ‹€.

  • 쑰건문: 반볡이 계속될지 κ²°μ •ν•˜λŠ” μ‘°κ±΄μž…λ‹ˆλ‹€. true일 λ•Œ 반볡이 μ‹€ν–‰λ©λ‹ˆλ‹€.

  • 증감문: 반볡이 끝날 λ•Œλ§ˆλ‹€ μ‹€ν–‰λ˜λ©°, 보톡 λ³€μˆ˜ 값을 증가 λ˜λŠ” κ°μ†Œμ‹œν‚΅λ‹ˆλ‹€.


break

반볡문 λ‚΄λΆ€μ—μ„œ νŠΉμ • 쑰건이 되면 breakλ₯Ό μ‹€ν–‰ν•˜μ—¬ λ°˜λ³΅λ¬Έμ„ λΉ μ Έλ‚˜κ°€κ²Œ ν•©λ‹ˆλ‹€. 주둜 쑰건을 λ§Œμ‘±ν•  λ•Œ λ°˜λ³΅λ¬Έμ„ μ€‘λ‹¨ν•˜κ³  싢을 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

 for (int i = 0; i < 10; i++) {
     if (i == 5) {
         break; 
     }
     printf("%d ", i);
 }
 // 0 1 2 3 4

continue

반볡문 λ‚΄λΆ€μ—μ„œ νŠΉμ • 쑰건이 되면 continueλ₯Ό μ‹€ν–‰ν•˜μ—¬ continue λ¬Έ μ΄ν•˜μ˜ μˆ˜ν–‰μ€ λ¬΄μ‹œν•˜κ³ , λ‹€μ‹œ 반볡문의 μ‹œμž‘μ μœΌλ‘œ λŒμ•„κ°€κ²Œ ν•©λ‹ˆλ‹€.

for (int i = 0; i < 10; i++) {
   if (i == 5) {
        continue; 
    }
    printf("%d ", i);
}
// 0 1 2 3 4 6 7 8 9



ν•¨μˆ˜

λ‚˜λˆ„μ–΄μ„œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ λͺ©μ , μ½”λ“œμ˜ 가독성 ν–₯상, μ½”λ“œμ˜ μœ μ§€ 보수 및 ν™•μž₯ 용이

μžλ£Œν˜• ν•¨μˆ˜μ΄λ¦„(인수λͺ©λ‘) {
  ν•¨μˆ˜ λ‚΄μš©  
}

μ‚¬μš©μž μ •μ˜ ν•¨μˆ˜

μ‚¬μš©μžκ°€ μžμ‹ μ΄ μ›ν•˜λŠ” κΈ°λŠ₯을 직접 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

#include <stdio.h>

int Add(int i, int j) {
  return i + j;
}

int main() {
  int a = 10;
  int b = 20;
  int c = 0;
  
  c = Add(a, b);
  printf("%d\n", c); // 30
  
  return 0;
}

ν‘œμ€€ ν•¨μˆ˜

μ–Έμ–΄μ—μ„œ 기본적으둜 μ œκ³΅ν•΄μ£ΌλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό λΌμ΄λΈŒλŸ¬λ¦¬ν™” μ‹œμΌœμ„œ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.

  • printf() : 좜λ ₯ ν•¨μˆ˜

  • scanf() : μž…λ ₯ ν•¨μˆ˜


void νƒ€μž… ν•¨μˆ˜

결과값을 λ¦¬ν„΄ν•˜μ§€ μ•ŠλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

void printMessage() {
  printf("Hello, World!\n");
}



λ³€μˆ˜

μ§€μ—­λ³€μˆ˜

νŠΉμ • μ½”λ“œ λΈ”λ‘μ—μ„œ μ„ μ–Έλ˜λ©°, ν•΄λ‹Ή 블둝이 싀행될 λ•Œ μƒμ„±λ˜κ³ , 싀행이 λλ‚˜λ©΄ μ†Œλ©Έν•˜λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

μ „μ—­λ³€μˆ˜

ν•¨μˆ˜ μ™ΈλΆ€μ—μ„œ μ„ μ–Έλ˜λ©°, ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ‹œ λ©”λͺ¨λ¦¬μ— ν• λ‹Ήλ˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ©λ‹ˆλ‹€.

static λ³€μˆ˜

μ§€μ—­λ³€μˆ˜μ²˜λŸΌ νŠΉμ • μ½”λ“œ 블둝 λ‚΄μ—μ„œ μ„ μ–Έλ˜μ§€λ§Œ, ν•œ 번 λ©”λͺ¨λ¦¬μ— μ €μž₯되면 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ  λ•ŒκΉŒμ§€ μœ μ§€λ©λ‹ˆλ‹€.

#include <stdio.h>

void func() {
    static int count = 0;  
    count++;  
    printf("static λ³€μˆ˜ count: %d\n", count);
}

int main() {
    func();  // 1 
    func();  // 2 
    func();  // 3 
    return 0;
}



λ°°μ—΄

같은 속성을 κ°€μ§„ 것듀을 λ‚˜μ—΄ν•΄ 놓은 것을 μ˜λ―Έν•©λ‹ˆλ‹€. μ •μˆ˜ν˜• λ³€μˆ˜ n개λ₯Ό μ„ μ–Έν•˜λŠ” 것보닀 배열을 μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•˜λ‹€.

μžλ£Œν˜• 배열이름[λ°°μ—΄μ˜ 길이];
  • 첫 번째 μΈλ±μŠ€λŠ” 무쑰건 0λΆ€ν„° μ‹œμž‘ν•©λ‹ˆλ‹€.

  • λ°°μ—΄μ˜ 길이λ₯Ό μƒλž΅ν•΄λ„ ν• λ‹Ήν•œ 값을 보고 μ»΄νŒŒμΌλŸ¬λŠ” λ°°μ—΄μ˜ 길이λ₯Ό 계산할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 배열끼리 볡사가 κ°€λŠ₯ν•˜μ§€λ§Œ 배열은 μƒμˆ˜μ΄κΈ° λ•Œλ¬Έμ— λŒ€μž… μ—°μ‚°μžλ₯Ό 톡해 값을 λ„˜κ²¨ 받을 수 μ—†κ³ , μš”μ†ŒλΌλ¦¬ 볡사해야 ν•©λ‹ˆλ‹€.

λ¬Έμžμ—΄ λ³€μˆ˜

λ¬Έμžμ—΄μ€ char 배열을 μ΄μš©ν•˜μ—¬ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ¬Έμžμ—΄ λμ—λŠ” μžλ™μœΌλ‘œ null 문자(\0)κ°€ μΆ”κ°€λ©λ‹ˆλ‹€.

char str[12] = "Hello World";

πŸ€” λ¬Έμžμ—΄ 끝에 null λ¬ΈμžλŠ” μ™œ ν•„μš”ν•œκ±ΈκΉŒ?

λ¬Έμžμ—΄μ€ 문자 λ°°μ—΄(char[])둜 μ €μž₯λ˜λŠ”λ°, λ°°μ—΄ μžμ²΄λŠ” 크기λ₯Ό μ•Œμ§€λ§Œ, λ¬Έμžμ—΄μ˜ κΈΈμ΄λŠ” μ•Œ 수 μ—†κΈ° λ•Œλ¬Έμ— λ¬Έμžμ—΄μ˜ 끝을 λͺ…ν™•ν•˜κ²Œ ν‘œμ‹œν•˜κΈ° μœ„ν•΄ null이 μ‚¬μš©λ©λ‹ˆλ‹€.




포인터

ν¬μΈν„°λŠ” 포인터 λ³€μˆ˜μ˜ μ€„μž„λ§λ‘œ λ©”λͺ¨λ¦¬μ˜ μ£Όμ†Œκ°’μ„ μ €μž₯ν•˜κ³  μžˆλŠ” λ³€μˆ˜μž…λ‹ˆλ‹€. 즉, νŠΉμ • λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 가리킀고 μžˆλ‹€λŠ” λœ»μž…λ‹ˆλ‹€.

  • 포인터 λ³€μˆ˜ μ„ μ–Έ μ‹œ 일반 λ³€μˆ˜λͺ… μ•žμ— * 기호λ₯Ό λΆ™μ—¬ ν‘œν˜„ν•©λ‹ˆλ‹€.

  • & 기호λ₯Ό 톡해 λ³€μˆ˜μ˜ μ£Όμ†Œκ°’μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

#include <stdio.h>

int main(void) {
  int b = 100;
  int *pB = &b;
  
  printf("b = %d\n", b); // b = 100
  printf("&b = %p\n", &b); // &b = 0x7ffeba62b72c
  printf("*pB = %d\n", *pB); // *pB = 100
  printf("pB = %p\n", pB); // pB = 0x7ffeba62b72c
  return 0;
}

포인터와 λ°°μ—΄

λ°°μ—΄μ˜ 이름은 ν•΄λ‹Ή λ°°μ—΄μ˜ 첫 번째 μš”μ†Œμ˜ μ£Όμ†Œκ°’μ„ κ°–μŠ΅λ‹ˆλ‹€. 즉, 첫 번째 μš”μ†Œμ˜ μ£Όμ†Œκ°’μ„ κ°€λ¦¬ν‚€λŠ” ν¬μΈν„°λΌλŠ” μ˜λ―Έμž…λ‹ˆλ‹€.

✨ λ°°μ—΄μ˜ 이름은 μ£Όμ†Œκ°’μ„ κ°–λŠ” ν¬μΈν„°μ΄μ§€λ§Œ μƒμˆ˜μ΄λ―€λ‘œ μ£Όμ†Œκ°’μ„ λ³€κ²½ν•  수 μ—†μŠ΅λ‹ˆλ‹€.


포인터와 ν•¨μˆ˜

기본적으둜 ν•¨μˆ˜μ— λ³€μˆ˜λ₯Ό μ „λ‹¬ν•˜λ©΄ 값이 λ³΅μ‚¬λ˜μ–΄ μ „λ‹¬λ©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 포인터λ₯Ό μ‚¬μš©ν•˜λ©΄ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ₯Ό 전달할 수 μžˆμ–΄, 원본 데이터λ₯Ό 직접 μˆ˜μ •ν•˜κ±°λ‚˜ μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

void func(int *pArr) {
  for(int i = 0; i < 5; i++) {
    printf("ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ : %d\n", *(pArr + i));
  }
}

int main() {
  int arr[] = {1, 2, 3, 4, 5};
  
  func(arr);
  
  return 0;
}
// ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ μš”μ†Œ: 1
// ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ μš”μ†Œ: 2
// ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ μš”μ†Œ: 3
// ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ μš”μ†Œ: 4
// ν•¨μˆ˜ μ•ˆμ˜ λ°°μ—΄ μš”μ†Œ: 5



✏️ 회고

포인터 μ—°μ‚°κ³Ό λ°°μ—΄, ν•¨μˆ˜ 인자 전달 λ°©μ‹μ—μ„œ 많이 ν—·κ°ˆλ¦¬κ³  λ‚―μ„€μ—ˆμ§€λ§Œ, νš¨μœ¨μ„± μΈ‘λ©΄μ—μ„œ 쒋은 λ°©μ•ˆμ΄λΌλŠ” κ±Έ κΉ¨λ‹¬μ•˜λ‹€. μ—¬λŸ¬ 번 λ³΄λ©΄μ„œ μ΅μˆ™ν•΄μ Έμ•Όκ² λ‹€..πŸ˜‚

profile
🌱개발 기둝μž₯

0개의 λŒ“κΈ€