2 분 소요

아직 블로그 제작중이다. 60%정도는 만들었다고 생각한다.

(EP18. 이미지 추가시 오류 해결 (A/S 영상))[https://www.youtube.com/watch?v=ndJ5B-DyBnA] 이 영상을 보면서 카테고리를 생성하면서 잘못 설계된 상대경로를 절대경로로 재정립시켜주는 작업을 했다.

그리고 아래 처럼 중괄호를 두번쓰면 동적파싱이 된다는 것을 알게 되었다. site라는 객체 안에 <pre>url, title, description, logo</pre>등 여러 프로퍼티들이 있다고 한다.

https://JackSmith-c.github.io/
CodingLog(by JackSmith-c)
기억보다 기록을 추구하는 나의 코딩일지
/assets/images/002.png

image-20231231132921114

[C]constant 이해하기

  1. 정수형 상수
  2. 실수형 상수
  3. 논리형 상수
  4. 문자형 상수
  5. 문자열형 상수

1)정수형 상수

다음 코드를 보자.

#include <stdio.h>

#define HUNDRED_THOUSAND 100000

const int j = 200000;

int main(void) {
    HUNDRED_THOUSAND = 100;
    j = 200;

    printf("정수형 상수 HUNDRED_THOUSAND의 값은 %d\n",HUNDRED_THOUSAND);
    printf("정수형 상수 j의 값은 %d\n", j);

    return 0;
}

위 코드는 상수로 선언 된 값을 main()부에서 임의로 수정하려는 시도를 해보는 상황입니다.

이때 상수값을 변경하려고 했기에 아래와 같이 오류가 생깁니다.

오류(활성) E0137 식이 수정할 수 있는 lvalue여야 합니다.

오류 C2106 ‘=’: 왼쪽 피연산자는 l-value이어야 합니다.

임의로 수정하는 코드를 제거하고 다시 컴파일을 돌려보면 다음과 같다.

image-20231231220528098

※고찰

원래 상수 선언할때 무조건 #define만 해보았고, const는 javascript에서만 사용해보았을뿐 C에서는 안되는 줄 알았는데, 되나보다ㅇㅇ

나머지 코드들 모두 비슷한 원리이다. 상수이기 때문에 main()부에서 임의로 수정하려는 시도를 했을때 모두 오류가 나는 것을 볼 수 있다.

2)실수형 상수

#include <stdio.h>

#define PI 3.14

const double j = 1.23456789;

int main(void) {
    PI = 3.141592;
    j = 3.33333;

    printf("실수형 상수 PI의 값은 %d\n", PI);
    printf("실수형 상수 j의 값은 %d\n", j);

    return 0;
}

3)논리형 상수

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int main(void) {
    if (TRUE)
    {
        printf("TRUE의 값은 참입니다.\n");
    }
    else
    {
        printf("TRUE의 값은 거짓입니다.\n");
    }

    if (FALSE)
    {
        printf("FALSE의 값은 참입니다.\n");
    }
    else
    {
        printf("FALSE의 값은 거짓입니다.\n");
    }
    return 0;
}

4)문자형 상수

문자형 상수를 정의하는 방법도 총 두가지 입니다. #define문과 const char형을 이용하는 것입니다.

#include <stdio.h>

#define HUNDRED 100

const char j = 10;

int main(void) {
    
    printf("문자형 상수 HUNDRED의 값은 %d\n", HUNDRED);
    printf("문자형 상수 j의 값은 %d\n", j);

    return 0;
}

cf.한글과 영어, 특수문자의 바이트 할당 차이

영어는 문자 하나당 총 1바이트가 할당됩니다. 그래서 <pre>char a[1] = ‘a’;</pre> 이 가능합니다.

하지만 한글은 문자 하나당 총 2바이트가 할당됩니다. 그래서 <pre>char b[2] = ‘안’</pre>이라고 해줘야 합니다.

마지막으로 특수문자는 운영체제마다 다르지만, 비주얼스튜디오에서 64비트로 돌려보았을때 총 3바이트가 필요한것 같습니다.

그래서 char c[3] = ‘●’이라고 해줘야 정상적으로 해당 문자를 사용할 수 있습니다.

5)문자열형 상수

#include <stdio.h>

#define KOREA "대한민국"
#define BOOK "This is a book."

const char* SOCCOR = "나는 축구를 좋아합니다.";

int main(void) {
    
    printf("문자열형 상수 KOREA의 값: %s\n", KOREA);
    printf("문자열형 상수 BOOK의 값: %s\n", BOOK);
    printf("문자열형 상수 SOCCOR의 값: %s\n", SOCCOR);

    return 0;
}

[백준]11382번 꼬마 정민

나는 처음에 이렇게 접근했다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    long long a, b, c;
    scanf("%d %d %d", &a, &b, &c);
    if (1 <= a && a << pow((double)10, (double)12)) {
        if (1 <= b && b << pow((double)10, (double)12)) {
            if (1 <= c && c << pow((double)10, (double)12)) {
                printf("%d", a + b + c);
            }
        }
    }

    return 0;
}

하지만 생각해보니 int타입에서는 10의 12승까지 안가더라도 2의 32승을 초과하는 정수값이 입력으로 들어오는 상황을 고려하지 못했단. 따라서 변수 a,b,c의 자료형을 int가 아닌 2의64승인 long long 타입으로 변환해주면 된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void) {
    long long a, b, c;
    scanf("%lld %lld %lld", &a, &b, &c);
    if (1 <= a && a < pow((double)10, (double)12)) {
        if (1 <= b && b < pow((double)10, (double)12)) {
            if (1 <= c && c < pow((double)10, (double)12)) {
                printf("%lld", a + b + c);
            }
        }
    }

    return 0;
}

※고찰 long long의 형식지정자가 <pre>%lld</pre>라는 것을 알게 됨.

언어: ,

카테고리:

업데이트:

댓글남기기