Study/C Language

씹어먹는 C언어 혼자 실습 (1)

imaginefuture-1 2024. 10. 16. 15:42

 

https://modoocode.com/231

 

씹어먹는 C 언어 시작하기

모두의 코드 씹어먹는 C 언어 시작하기 작성일 : 2009-04-15 이 글은 526306 번 읽혔습니다. 안녕하세요 여러분. 씹어먹는 C 언어를 연재하고 있는 Psi 입니다. 제 강좌는 제가 참고했던 무수히 많은 책,

modoocode.com

 

혼자 실습 기록용

//#include <stdio.h>
////int main() {
//	//	int a;
//	//	a = 100000000000;
//	//	printf("a 의 값은 : %d \n", a);
//	//	return 0;
////}
//
////int main() {
////	int a = 10;
////	a = 127;
////	printf("a의 값은 %d 진수로 %o입니다. \n", 8, a);
////	printf("a의 값은 %d 진수로 %d입니다. \n", 10, a);
////	printf("a의 값은 %d 진수로 %x입니다. \n", 16, a);
////}
//
////int main() {
////
////	float a = 3.141592f;
////	double b = 3.141592;
//////	printf("a : %f \n", a);
//////	printf("b : %f \n", b);
//////	return 0;
////	printf("%f", 1.0);
////}
//
////int main() {
////	float a = 3.141592f;
////	double b = 3.141592;
////	int c = 123;
////	printf(" a: %5.4f \n", a);
////	printf(" c: %5d \n", c);
////	printf(" b: %6.3f \n", b);
////	return 0;
////}
//
///*산술 연산자*/
////int main() {
////	int a, b;
////	a = 10;
////	b = 3;
////	//printf("a + b 는 : %d \n ", a + b);
////	//printf("a - b 는 : %d \n ", a - b);
////	//printf("a * b 는 : %d \n ", a * b);
////	printf("a / b 는 : %f \n ", a / b);
////	//printf("a %% b 는 : %d \n ", a % b);
////}
//
///*대입연산자*/
////int main() {
////	int a = 3;
////	a = a + 3;
////	printf ("a 의 값은 : %d \n",  a);
////	return 0;
////}
//
///*더하기 1을 하는 방법*/
////int main() {
////	int a = 1, b = 1, c = 1, d = 1;
////	a = a + 1;
////	printf("a : %d\n", a);
////	b += 1;
////	printf("b : %d\n", b);
////	c++;
////	printf("c : %d\n", c);
////	++d;
////	printf("d : %d\n", d);
////	return 0;
//
///*prefix, postfix*/
//int main(){
//	int a = 1;
//	printf("++a : %d\n", ++a);
//	a = 1;
//	printf("a++: %d\n", a++);
//	printf("a : %d \n", a);
//	return 0;
//
//
//
//}

#include <stdio.h>
//int main() {
	//	int a;
	//	a = 100000000000;
	//	printf("a 의 값은 : %d \n", a);
	//	return 0;
//}

//int main() {
//	int a = 10;
//	a = 127;
//	printf("a의 값은 %d 진수로 %o입니다. \n", 8, a);
//	printf("a의 값은 %d 진수로 %d입니다. \n", 10, a);
//	printf("a의 값은 %d 진수로 %x입니다. \n", 16, a);
//}

//int main() {
//
//	float a = 3.141592f;
//	double b = 3.141592;
////	printf("a : %f \n", a);
////	printf("b : %f \n", b);
////	return 0;
//	printf("%f", 1.0);
//}

//int main() {
//	float a = 3.141592f;
//	double b = 3.141592;
//	int c = 123;
//	printf(" a: %5.4f \n", a);
//	printf(" c: %5d \n", c);
//	printf(" b: %6.3f \n", b);
//	return 0;
//}

/*산술 연산자*/
//int main() {
//	int a, b;
//	a = 10;
//	b = 3;
//	//printf("a + b 는 : %d \n ", a + b);
//	//printf("a - b 는 : %d \n ", a - b);
//	//printf("a * b 는 : %d \n ", a * b);
//	printf("a / b 는 : %f \n ", a / b);
//	//printf("a %% b 는 : %d \n ", a % b);
//}

/*대입연산자*/
//int main() {
//	int a = 3;
//	a = a + 3;
//	printf ("a 의 값은 : %d \n",  a);
//	return 0;
//}

/*더하기 1을 하는 방법*/
//int main() {
//	int a = 1, b = 1, c = 1, d = 1;
//	a = a + 1;
//	printf("a : %d\n", a);
//	b += 1;
//	printf("b : %d\n", b);
//	c++;
//	printf("c : %d\n", c);
//	++d;
//	printf("d : %d\n", d);
//	return 0;

/*prefix, postfix*/
#include <stdio.h>

int main() {
	printf("Size of int: %lu bytes\n", sizeof(int));
	return 0;
}

 

 

text.scanf_s

//#include <stdio.h>
//int main() {
//	char a;
//		a = 'a';
//	printf("a 의 값이 들어 있는 문자는? 값 : %d , 문자 : %c \n", a,  a);
//	return 0;
//}

/*섭씨온도를 화씨로 바꾸기*/
//int main() {
//	double celsius; //섭씨온도
//	printf("섭씨 온도를 화씨 온도로 바꿔주는 프로그램입니다. \n");
//	printf("섭씨 온도를 입력해주세요: ");
//	scanf_s("%lf", &celsius); // 섭씨 온도를 입력 받는다.
//	printf("섭씨 %f 도는 화씨로 %f 도 입니다\n", celsius, 9 * celsius / 5 + 32);
//	return 0;
//}
/* scanf 총 정리  */

#include <stdio.h>
int main() {
	char ch;  // 문자

	short sh;  // 정수
	int i;
	long lo;

	float fl;  // 실수
	double du;

	printf("char 형 변수 입력 : ");
	scanf_s("%c", &ch);

	printf("short 형 변수 입력 : ");
	scanf_s("%hd", &sh);
	printf("int 형 변수 입력 : ");
	scanf_s("%d", &i);
	printf("long 형 변수 입력 : ");
	scanf_s("%ld", &lo);

	printf("float 형 변수 입력 : ");
	scanf_s("%f", &fl);
	printf("double 형 변수 입력 : ");
	scanf_s("%lf", &du);

	printf("char : %c , short : %d , int : %d ", ch, sh, i);
	printf("long : %ld , float : %f, double : %f \n", lo, fl, du);
	return 0;
}

if문

//#include <stdio.h>
//int main() {
//	int i;
//	printf("입력하고 싶은 수자를 입력하세요!: ");
//	scanf_s("%d", &i);
//	if (i == 7) {
//		printf("당신은 행운의 숫자 7를 입력함 올ㅋ");
//
//	}
//	return 0;
//}

//#include <stdio.h>
//int main() {
//double i, j;
//printf("나누고싶은 두 정수를 입력하세요 : ");
//scanf_s("%lf %lf", &i, &j);
//
//if (j == 0) {
//	printf("0으로 나눌 수 없음\n");
//	return 0;
//}
//		
//printf("%f 를 %f로 나눈 결과는 : %f\n", i, j, i / j);
//return 0;
//}

///* 합격? 불합격? */
//#include <stdio.h>
//int main() {
//    int score;
//
//    printf("당신의 수학점수를 입력하세요! : ");
//    scanf_s("%d", &score);
//
//    if (score >= 90) {
//        printf("당신은 합격입니다! \n");
//    }
//
//    if (score < 90) {
//        printf("당신은 불합격 입니다! \n");
//    }
//
//    return 0;
//}

/* 크기 비교하기 */
#include <stdio.h>
int main() {
    int i, j;

    printf("크기를 비교할 두 수를 입력해 주세요 : ");
    scanf_s("%d %d", &i, &j);

    if (i > j)  // i 가 j 보다 크면
    {
        printf("%d 는 %d 보다 큽니다 \n", i, j);
    }

    if (i < j)  // i 가 j 보다 작으면
    {
        printf("%d 는 %d 보다 작습니다 \n", i, j);
    }

    if (i >= j)  // i 가 j 보다 크거나 같으면
    {
        printf("%d 는 %d 보다 크거나 같습니다 \n", i, j);
    }

    if (i <= j)  // i 가 j 보다 작거나 같으면
    {
        printf("%d 는 %d 보다 작거나 같습니다 \n", i, j);
    }

    if (i == j)  // i 와 j 가 같으면
    {
        printf("%d 는 %d 와(과) 같습니다 \n", i, j);
    }

    if (i != j)  // i 와 j 가 다르면
    {
        printf("%d 는 %d 와(과) 다릅니다 \n", i, j);
    }

    return 0;
}

if else

 

//#include <stdio.h>
//int main() {
//    int num;
//
//    printf("아무 숫자나 입력해 보세요 : ");
//    scanf_s("%d", &num);
//
//    if (num == 7) {
//        printf("행운의 숫자 7 이군요!\n");
//    }
//    else {
//        printf("그냥 보통 숫자인 %d 를 입력했군요\n", num);
//    }
//    return 0;
//
//}

///* 새로쓰는 죽음의 숫자 예제 */
//#include <stdio.h>
//int main() {
//    int num;
//
//    printf("아무 숫자나 입력해 보세요 : ");
//    scanf_s("%d", &num);
//
//    if (num == 7) {
//        printf("행운의 숫자 7 이군요!\n");
//    }
//    else if (num == 4) {
//        printf("죽음의 숫자 4 인가요 ;;; \n");
//    }
//    else {
//        printf("그냥 평범한 숫자 %d \n", num);
//    }
//    return 0;
//}

/* if 와 if- else if 의 차이*/
//#include <stdio.h>
//int main() {
//    int num;
//
//    printf("아무 숫자나 입력해 보세요 : ");
//    scanf_s("%d", &num);
//
//    if (num == 7) {
//        printf("a 행운의 숫자 7 이군요!\n");
//    }
//    else if (num == 7) {
//        printf("b 행운의 숫자 7 이군요! \n");
//    }
//
//    // 비교
//    if (num == 7) {
//        printf("c 행운의 숫자 7 이군요!\n");
//    }
//    if (num == 7) {
//        printf("d 행운의 숫자 7 이군요! \n");
//    }
//
//    return 0;
//}

///* 크기 비교 */
//#include <stdio.h>
//int main() {
//    int a;
//    printf("아무 숫자나 입력하세요 : ");
//    scanf_s("%d", &a);
//
//    if (a >= 10) {
//        if (a < 20) {
//            printf(" %d 는 10 이상, 20 미만인 수 입니다. \n", a);
//        }
//    }
//    return 0;
//
//}
//
///* 논리 연산자 */
//#include <stdio.h>
//int main() {
//    int a;
//    printf("아무 숫자나 입력하세요 : ");
//    scanf_s("%d", &a);
//
//    if (a >= 10 && a < 20) {
//        printf(" %d 는 10 이상, 20 미만인 수 입니다. \n", a);
//    }
//
//    return 0;
//}

//#include <stdio.h>
//
//int main() {
//	int a = 31, b = 15;
//	printf("a & b = %d\n", a & b);
//	printf("a && b = %d\n", a && b);
//}

/* 논리 합 */
#include <stdio.h>
int main() {
    int height, weight;
    printf("당신의 키와 몸무게를 각각 입력해 주세요 : ");
    scanf_s("%d %d", &height, &weight);

    if (height >= 190 || weight >= 100) {
        printf("당신은 '거구' 입니다. \n");
    }

    return 0;
}

 

 

주의 

 

왜 & 대신에 && 를 쓸까?

그렇다면 우리가 여태 알고 있었던 AND 연산 기호인 & 를 쓰지 않고 && 를 쓰는 것일까요? 그 이유는 & 하나는, 말 그대로 비트 사이의 AND 연산을 사용 할 때 사용하는 것이로, 조건식 사이의 관계를 표현하고 싶다면 논리 곱 연산자인 && 를 사용해야 합니다.

쉽게 말해 & 는 정확한 비트 AND 연산 결과를 제공하고, && 는 그냥 참 (= 1) 혹은 거짓 (= 0) 만을 알려줍니다. 따라서 만약에 어떠한 int 변수 a  b 사이에 AND 연산을 하고 싶다면 a & b 를 해야지, a && b 를 하면 올바른 AND 연산을 수행할 수 없습니다. 간단히 아래 예제를 보면 알 수 있습니다.

#include <stdio.h>

int main() {
  int a = 31, b = 15;
  printf("a & b = %d\n", a & b);
  printf("a && b = %d\n", a && b);
}

성공적으로 컴파일 하였다면

실행 결과

a & b = 15
a && b = 1

흠 그렇다면 반대로 && 자리에 & 를 써도 무방할 것 같은데 말이죠. 왜냐하면 위에서도 말했듯이 0 이 아닌 모든 값들은 어차피 참으로 간주되기 때문이죠. 그런데 왜 논리식 사이에는 && 를 사용하는 것이 바람직할까요?

Short Circuit Evaluation

예를 들어서 다음과 같은 문장을 생각해봅시다.

if (height >= 180 && weight >= 90) {
}

만약에 height 가 179 라고 해봅시다. 그렇다면 굳이 그 다음의 조건식인 weight >= 90 을 확인해봐야 할까요? 아닙니다. AND 의 경우 어차피 둘 중 하나가 거짓이라면, 그 다음것은 확인해볼 필요도 없이 전체 연산 결과가 거짓임을 알 수 있습니다. 따라서 굳이 weight >= 90 을 확인해볼 필요가 없습니다.

위 경우 처럼 한 조건식을 확인하였는데 전체 결과가 정해져 있는 경우, 굳이 그 다음 조건식을 확인할 필요가 없습니다. 이 같은 경우 컴퓨터는 뒤의 조건식을 확인하지 않는데 (쓸데 없는 연산을 줄이기 위해서), 이와 같은 방식을 Short Circuit Evaluation 이라고 부릅니다. (줄여서 SCE 라고 부릅시다.)

만약에 height >= 180 & weight >= 90 처럼 & 를 사용하였다면 SCE 를 적용할 수 없습니다. 왜냐하면 & 는 정확한 연산 결과를 제공해야 하므로 뒤에 오는 식도 반드시 계산을 해야 하기 때문이죠. 하지만 && 는 논리 결과에 따라서 0 혹은 1 만 돌려주면 되기 때문이므로 SCE 를 사용 할 수 있습니다.

'Study > C Language' 카테고리의 다른 글

씹어먹는 C언어 혼자 실습 (3) switch문  (1) 2024.10.17
씹어먹는 C언어 혼자 실습 (2)  (6) 2024.10.16