티스토리 뷰

[특강 1] print 출력순서

문제1 풀이
#include<stdio.h>
int main() 
{
  int i=5;
printf("%d, %d, %d, %d", i++, ++i, i++, ++i);
}
1차풀이)
i++ 5출력 후 i=6, ++1 후 출력7, 7출력후 i=8, +1후출력9

*** print는 뒤에서 부터 출력.... 충격적..ㅋㅋ
2차풀이)
+1후출력6, 6출력후+1,i=7, +1후 출력8, 8출력후+1 i=9
*** ++나--가 앞에 오면 연산을 할 당시의 i값을 참조,
현재는 연산을 하지 않아서 i최종을 기다려야함

3차풀이)
++i, i+1=6연산, i를 확정짓지 않음 => i = 9
i++, 현재 i=6를 참조 i=i+1=7 =>6
++i, i+1=8연산, i를 확정짓지 않음=> i = 9
i++, 현재 i=8를 참조  i= i+1=9 =>8
최종적으로 i=9를 참조함
printf의 순서에 맞게 8,9,8,9 출력
문제2 풀이
#include<stdio.h>
int main()
{
  int i = 5;
  printf("%d, %d, %d, %d", --i,i--,i--,--i, i);
}
뒤에서 부터 진행
i, 뭐가 나올지 모름 → 1
--i, 연산만 진행 i=5-1=4 → 1
i--, 현재 i=4 참조 후 i=i-1=4-1=3 → 4
i--, 현재 i=3 참조 후 i=i-1=3-1=2 → 3
--i, 연산만 진행 i=2-1=1 → 1
연산만 진행했던 i들은 1을 최종적으로 참조함
printf의 순서에 따라 1,3,4,1,1

 

[특강 2] ++중복 

문제1 (++가 뒤에올때) 풀이
#include<stdio.h>
int main()
{
  int i = 5;
  int z = i++ + i++ + i++;
  printf("%d, %d, i, z)
}
i++, 현재i값 참조→5, i=i+1=6
i++, 현재i값 참조→6, i=i+1=7
i++, 현재i값 참조→7, i=i+1=8
i=8
z = 5+6+7=18

8,18 출력
문제2 (++가 앞에올때,연산 시점의 값을 참조***) 풀이
#include<studio.h>
int main()
{
  int i = 5;
  int z = ++ i + ++ i + ++ i ;
  printf("%d, %d, i, z)
}
* ++나--가 앞에 오면 연산을 할 당시의 i값을 참조,
++i , i+1연산만 함 i=5+1=6
++i , i+1연산만 함 i=6+1=7
연산자를 만나 현재 i값을 참조해서 계산한다.7+7 = 14
*** 앞에꺼부터 연산시작하니까 뒤에 ++i까지 기다리는거 아님, 앞에꺼부터 연산시작하니까

14 + ++i에서 현재 i=7, i=7+1=8하고 연산자+를 만나
i=8을 참조하여 z=14+8= 22, i=8
문제3 풀이
#include<studio.h>
int main()
{
  int i= 5;
  int z = ++i + i ++ + ++i;
  printf("%d, %d", i, z);
}
++i, 연산만 i=5+1=6
i++, 현재 i값 참조6, i=i+1=7
+연산 => 현재 i=7 + 6 =13
++i, 선증가 i=i+1=8
13+연산만나 현재i=8참조=21
i=8, z=21 

[특강 3] fork 함수 (***순서가 중요)

* 리눅스에서 자식 프로세스를 생성할 때 쓰는 것 

- fork()실행시 리턴 값 : 실패 -1, 자식 0, 부모 0보다 큰 값 ex.200 (자식프로세스의 프로세스 ID를 받음)

-순서 : 부모 실행(ex.200) > 자식실행(0) (총 2번 실행됨)

*부모가 wait을 만나면 자식이 끝날때까지 기다려야함(자식이 다 돌면 부모가 함, wait이 없으면 부모 먼저 실행)

문제 풀이
int i=0, v=1, n=5;
pid_tpid;
pid= fork();

if(pid<0) {
  for(i=0; i<n; i++) v += (i+1);
  printf("c = %d", v);
}
else if(pid ==0){
   for(i=0; i<n; i++) v *= (i+1);
   printf("b= %d,",v);
}
else {
wait(NULL);
for (i=0; i<n; i++) v+=1;
printf("a =%d", v);
}
pid=fork()실행;
부모 먼저 실행, pid(부모)>0 → else wait 만남: 자식먼저 실행
pid(자식)==0 → else if의 for문 수행
i=0, 0<5, v= 1*(0+1)=1
i=1. i<5, v=1*(2)=2
i=2, 2<5 v=2*3=6
i=3, 3<5 v=6*4=24
i=4, 4<5 v=24*5=120
i=5, 5<5거짓, for문 빠져나옴 b=120 출력
wait에 걸렸던 부모의 for문 실행
* pid가 리턴을 부모, 자식 각각 받아 if문을 각각 실행하므로
v=120에서 시작하는 것이 아닌 v=1을 적용
i=0, 0<5, v=1+1=2
i=1, 1<5, v=2+1=3
i=2, 2<5, v=3+1=4
i=3, 3<5, v=4+1=5
i=4, 4<5, v=5+1=6
i=5, for문 빠져나옴 a=6 출력

 

※ 출처 : 흥달쌤 C언어 특강 1~3강 https://youtu.be/G_SIfsm00TU?si=XJSTDGBQYWpEyuDb

※ 컴파일 사이트 : http://ideone.com

 

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함