다음 프로그램을 실행할 경우 출력 결과를 작성하라.(오류가 나면 오류도 함께 작성할 것.)
1.1.
#include <stdio.h>
#define PR(X,Y,Z) printf("X=%d, Y=%d, Z=%d\n", X, Y, Z)
int x=1, y=3, z=7;
int sum(int *x, int y){
PR(z,*x,y);
*x = 4;
y = -y;
return (*x+y+z);
}
int main(){
int x=2, z;
z=sum(&y, x);
PR(x,y,z);
z=sum(&x, z);
PR(y,z,x);
return 0;
}
1.2.
#include <stdio.h>
int x = 10;
void f( ){
x++;
printf("%d, ", x);
}
void g( ){
static int x = 30;
printf("%d, ", x++);
printf("%d, ", x++);
}
int main( ){
int x = 8;
printf("%d, ", ++x);
{
int x = 7;
printf("%d, ", ++x);
}
g( );
f( );
g( );
return 0;
}
Solution
1.1.
① z=sum(&y, x);
여기서 y는 global 변수의 y이고, (global::y의 주소)
x는 main함수의 x입니다. (main::x의 값 = 2)
①-1 PR(z, *x, y);
여기서 z는 global 변수의 z이고, (global::z의 값 = 7)
*x는 main 함수에서 데려온 &y가 가르키는 값, (global::y의 값 = 3)
y는 main 함수에서 데려온 x가 가르키는 값입니다. (main::x의 값 = 2)
따라서 X=7, Y=3, Z=2 가 출력됩니다.
①-2 *x=4;
*x는 main 함수에서 데려온 &y(global::y의 주소)입니다.
&y가 가르키는 값을 변경하면 되므로, global 변수의 y 값은 4로 변하게 됩니다.
①-3 y=-y;
y에 –y를 넣었습니다. 즉, sum함수의 y가 –2가 되었습니다.
(global 변수에도 y가 있지만, sum 함수에도 y가 있으므로, 함수 내의 변수가 우선순위를 갖게 됩니다.)
①-4 return (*x+y+z);
*x는 아까 global변수 y의 주소이므로, 이 주소가 가르키는 값은 4입니다.
y는 sum함수의 y 변수이므로, -2가 됩니다.
z는 sum 함수에 z 변수가 없으므로, global 변수의 z 값을 가져와 7이 됩니다.
따라서 이 값이 return되는 main 함수의 z는 4-2+7=9 가 됩니다.
--------------------------------------------------------------------------
② PR(x, y, z);
x는 main 함수의 x 값인 2가 됩니다.
y는 main 함수에 y가 없으므로, global 변수 y의 값인 4가 됩니다.
z는 ①-4에서 9로 바뀌었으므로, 9가 됩니다.
따라서 X=2, Y=4, Z=9 가 출력됩니다.
-------------------------------------------------------------------------
③ z=sum(&x, z);
여기서 x는 main 함수의 x이고, (main::x의 주소)
z는 main 함수의 z입니다. (main::z의 값 = 9)
③-1 PR(z, *x, y);
여기서 z는 global 변수의 z이고, (global::z의 값 = 7)
*x는 main 함수에서 데려온 &x가 가르키는 값, (main::x의 값 = 2)
y는 main 함수에서 데려온 z가 가르키는 값입니다. (main::x의 값 = 9)
따라서 X=7, Y=2, Z=9 가 출력됩니다.
③-2 *x=4;
*x는 main 함수에서 데려온 &x(main::x의 주소)입니다.
&x가 가르키는 값을 변경하면 되므로, main 함수의 x 값은 4로 변하게 됩니다.
③-3 y=-y;
y에 –y를 넣었습니다. 즉, sum함수의 y가 –9가 되었습니다.
(global 변수에도 y가 있지만, sum 함수에도 y가 있으므로, 함수 내의 변수가 우선순위를 갖게 됩니다.)
③-4 return (*x+y+z);
*x는 아까 main함수 x의 주소이므로, 이 주소가 가르키는 값은 4입니다.
y는 sum함수의 y 변수이므로, -9가 됩니다.
z는 sum 함수에 z 변수가 없으므로, global 변수의 z 값을 가져와 7이 됩니다.
따라서 이 값이 return되는 main 함수의 z는 4-9+7=2 가 됩니다.
----------------------------------------------------------------------------
④ PR(y, z, x);
y는 main 함수에 y가 없으므로, global 변수의 y값인 4가 됩니다.
z는 ③-4에서 2로 변경되었으므로, 2가 됩니다.
x는 ③-2에서 4로 변경되었으므로, 4가 됩니다.
따라서 출력은 X=4, Y=2, Z=4 가 됩니다.
<정답>
X=7, Y=3, Z=2
X=2, Y=4, Z=9
X=7, Y=2, Z=9
X=4, Y=2, Z=4
1.2.
① int x = 8;
main 함수의 x 변수가 8의 값을 갖게 됩니다.
② printf(“%d, ”, ++x);
①번의 x 값이 1이 더해진 후 출력되므로, 9, 가 출력됩니다.
③ int x = 7;
이 x 값은 main 함수 내의 중괄호 안에서 다시 선언되었으므로,
이 중괄호 안에서는 x 값이 7이 됩니다.
④ printf(“%d, ”, ++x);
③번에서 다시 선언된 x 값이 1이 더해진 후 출력되므로, 8, 가 출력됩니다.
------------------------------------------------------------------
⑤ g();
g() 함수를 call 합니다.
⑤-1 static int x = 30;
g() 함수 안에서 정적 변수 x가 선언되었습니다.
static 변수는 함수를 벗어나더라도 변수가 사라지지 않고 계속 유지됩니다.
⑤-2 printf(“%d, ”, x++);
g() 함수 안의 x 값을 출력한 후 1을 더하므로, 30, 이 출력된 후,
g() 함수의 x 값은 31이 됩니다.
⑤-3 printf(“%d, ”, x++);
⑤-2 와 같은 이유로 31, 이 출력된 후, g() 함수의 x값은 32가 됩니다.
------------------------------------------------------------------
⑥ f();
f() 함수를 call 합니다.
⑥-1 x++;
f() 함수는 x 변수를 갖지 않으므로, global 변수 x 값에 1을 더합니다.
따라서 global 변수의 x값은 11이 됩니다.
⑥-2 printf(“%d, ”, x);
⑥-1의 x값을 더하므로, 11, 이 출력됩니다.
------------------------------------------------------------------
⑦ g();
g() 함수를 call 합니다.
⑦-1 static int x = 30;
마치 x 값이 다시 선언된 것 같지만, 이 x는 정적 변수이므로,
⑤에서의 32의 값이 그대로 유지되어있습니다.
⑦-2 printf(“%d, ”, x++);
⑤-2 와 같은 이유로 32, 이 출력된 후, g() 함수의 x값은 33이 됩니다.
⑦-3 printf(“%d, ”, x++);
⑤-2 와 같은 이유로 33, 이 출력된 후, g() 함수의 x값은 34가 됩니다.
<정답>
9, 8, 30, 31, 11, 32, 33,
'학부공부 > C_Basic' 카테고리의 다른 글
2. Project_64 PuyoPuyo[C Basic] (0) | 2021.11.07 |
---|---|
1. Project_KU Mobile Phone Bill Calculator[C Basic] (0) | 2021.11.07 |
10. File[C Basic] (0) | 2021.11.07 |
9. Struct[C Basic] (0) | 2021.11.07 |
8. Bit operator[C Basic] (0) | 2021.11.07 |
댓글