
1071. 입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자. 비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.)정수가 순서대로 입력된다. -2147483648 ~ +2147483647, 단 개수는 알 수 없다. 0이 아니면 입력된 정수를 출력하고, 0이 입력되면 출력을 중단해보자. while( ), for( ), do~while( ) 등의 반복문을 사용할 수 없다. Insight ✔ "이름:" 과 같이 콜론(:)이 붙어있는 부분을 이름표(label, 레이블)라고 한다. ✔ 레이블은 특별한 선언 없이 사용할 수 있으며 언더바(_)나 영문자로 시작하면 된다. ✔ 레이블은 한 단어처럼 공백없이 모두 붙여 써야 한다. ✔ switch( ) ... case ..

1059. 입력 된 정수를 비트단위로 참/거짓을 바꾼 후 정수로 출력해보자. 비트단위(bitwise)연산자 ~ 를 붙이면 된다.(~ : tilde, 틸드라고 읽는다.) 입력. 2 (00000010) 출력. -3 (11111101 → 00000011) #include int main(void) { int n; scanf("%d", &n); printf("%d\n",~n); return 0; } 1060. 입력된 정수 두 개를 비트단위로 and 연산한 후 그 결과를 정수로 출력해보자. 비트단위(bitwise)연산자 &를 사용하면 된다.(and, ampersand, 앰퍼센드라고 읽는다.) 입력. 3 5 출력. 1 #include int main(void) { int n1, n2; scanf("%d %d", &..

1053. 1(true, 참) 또는 0(false, 거짓) 이 입력되었을 때 반대로 출력하는 프로그램을 작성해보자. 입력. 1 출력. 0 #include int main(void) { int a; scanf("%d",&a); printf("%d\n",!a); return 0; } 1054. 두 개의 참(1) 또는 거짓(0)이 입력될 때, 모두 참일 때에만 참(1)을 출력하는 프로그램을 작성해보자. 입력. 1 1 출력. 1 #include int main(void) { int a,b; scanf("%d %d",&a,&b); if(a&&b){ printf("1\n"); }else{ printf("0\n"); } return 0; } 1055. 두 개의 참(1) 또는 거짓(0)이 입력될 때, 하나라도 참이면 ..

8-9. 파일 쓰기/파일 읽기 힙 오버플로우와 스택 오버플로우 ✔ heap 영역에서는 malloc()에 의해 메모리가 할당될수록, 점점 사용하는 메모리가 아래로 늘어난다. ✔ stack 영역에서는 함수가 호출될수록, 점점 사용하는 메모리가 위로 늘어난다. ✔ 어느 순간 제한된 메모리 내에서 기존의 값을 서로 침범하는 상황이 발생할 수도 있다. ✔ 이런 상황을 힙 오버플로우 또는 스택 오버플로우라고 말한다. ✔ 컴퓨터가 너무 많은 메모리를 사용하면 파일이나 사진이 열리지 않거나 화면이 정지하거나 하는 상황이 발생한다. ✔ 이런 상황은 버퍼 오버플로우라고 한다. 배열의 이름과 포인터 #include int main(void){ char *str = NULL; scanf("%s",str2); printf("%..

7. 메모리 교환, 스택, 힙 heap과 stack machine code ✔ 프로그램 시작 → 메모리 가장 위에 머신 코드가 올라간다. globals ✔ 프로그램이 사용하는 전역변수나 값은 machine code의 바로 아래 공간을 사용한다. heap ↓ ✔ malloc() 호출 시, heap에서 메모리를 가져와 할당받는다. ✔ 위에서 아래로 쌓인다. ↑ stack ✔ 함수를 호출할 때마다, 함수의 인자와 지역변수는 stack 공간에 위치한다. ✔ 호출된 함수는 명령문을 모두 실행하면 함수를 다시 호출하지 않는 이상 작동하지 않는다. ✔ stack은 메모리의 가장 아래 영역에 위치한다 ✔ 아래에서 위로 쌓인다 stack #include void swap(int a, int b); int main(voi..

6. 메모리 할당과 해제 ✔ malloc 함수를 이용하면 메모리 할당이 가능하다 ✔ 할당된 메모리를 모두 사용한 후에는 반드시 free라는 함수를 사용해 메모리를 해제해주어야한다 ✔ 그렇지 않으면 메모리에 저장한 값이 쓰레기 값으로 남아 메모리 용량의 낭비가 발생하기 때문 ✔ 이러한 현상을 메모리 누수라고 한다 버퍼 오버플로우 할당받은 메모리를 초과하는 메모리를 사용하고자 할 때 발생하는 메모리 누수 #include #include int main(void) { int *x = malloc(10 * sizeof(int)); x[10] = 0; //버퍼 오버플로우 발생 free(x); return 0; } ✔ 배열 x 에는 정수형 값을 총 10개 저장할 수 있다. ✔ 배열의 index는 0부터 시작되므로,..

3. 문자열 문자열은 문자의 배열이고, 배열 마지막에는 문자열의 끝을 나타내는 \0(null 종단 문자)이 저장된다. 문자열을 출력하기 위해서는 포인터(*)를 사용해야 한다. char형 배열의 이름은 결국 문자열을 가리키는 포인터가 된다. 말하자면 C언어에서는 string을 char *이라고 말한다고 볼 수 있다. #include int main(void){ char *str = "Hello World"; printf("%s\n", str); return 0; } 4. 문자열 비교 문자의 배열의 이름은 문자열을 가리키는 포인터인데, 더 상세하게 말하면 배열에 저장된 첫 번째 문자를 가리킨다. 배열에 저장된 문자 하나하나의 주소를 확인해보자. #include int main(void) { char *s =..