코딩일지(2023-12-31)
아직 블로그 제작중이다. 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
[C]constant 이해하기
- 정수형 상수
- 실수형 상수
- 논리형 상수
- 문자형 상수
- 문자열형 상수
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이어야 합니다.
임의로 수정하는 코드를 제거하고 다시 컴파일을 돌려보면 다음과 같다.
※고찰
원래 상수 선언할때 무조건 #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>라는 것을 알게 됨.
댓글남기기