본문 바로가기
TIL/따배씨

반복문(2021-01-08 ~ 2021-01-09)

by Dev_Dank 2021. 1. 8.

6.1 while 반복 루프에서 scanf()의 반환값 사용하기 

scanf함수의 반환값은 입력받은 것의 갯수가 몇개인지 리턴값으로 돌려준다는점에 주의 

여기서 q를 입력하면 num은 int로 선언된 변수니까 q가 num에 담기지 않고 scanf의 리턴값도 0이 되어버린다. 

6.2 의사 코드 Pseudo Code

사람이 직관적으로 이해할수 있도록 말로 코드를 풀어쓴것 
이하의 예시 참조

6.3 진입조건 루프 while

while 사용시 주의점

-while은 왠만해서는 {}로 묶을것

while 밑부분을 {}로 묶지 않아 제대로 작동 안함.

-while 의 조건부분 뒤에 바로 ;를 붙이면 안됨.


6.4 관계 연산자

사실상 파이썬 관계연산자와 똑같아서 정리할 부분이 없다. 

6.5 사실과 거짓

관계식에서 중요한점은 관계식(expression)이 값(value)를 가진다는 것이었다. 

1<2 와 1>2 두개의 expression이 각각 1과 0이라는 값을 변수 tv와 fv에 대입해주는 것

0은 False이며 그 이외의 값들은 True라는 식으로 기억 해둘 것

6.6 _Bool 자료형

C언어는 불은 내부적으로 정수형으로 처리함. 

불리언을 선언하는 방법에는 _Bool boolean_true = {2>1}을 쓰는 방법과 #include<stdbool.h>를 한뒤 bool bt = true; 와 같이 쓰는 방법이 있다. 

6.7 관계 연산자의 우선순위

www.tutorialspoint.com/cprogramming/c_operators_precedence.htm

 

Operators Precedence in C - Tutorialspoint

Operators Precedence in C Operator precedence determines the grouping of terms in an expression and decides how an expression is evaluated. Certain operators have higher precedence than others; for example, the multiplication operator has a higher preceden

www.tutorialspoint.com

6.8 for 루프 소개

c에서의 for는 기본적으로 이렇게 작동한다. 

상세한 예시는 이하 참조

6.9 for 는 유연해요

본강의에서는 모든 예제를 알려줄수가 없다 이후 알고리즘등을 풀면서 살펴볼것

for는 이렇게도 사용 할 수 있다. 

6.10 다양한 대입 연산자들 (그리고 어셈블리 코드 확인법)

en.cppreference.com/w/c/language/operator_precedence

 

C Operator Precedence - cppreference.com

The following table lists the precedence and associativity of C operators. Operators are listed top to bottom, in descending precedence. Precedence Operator Description Associativity 1 ++ -- Suffix/postfix increment and decrement Left-to-right () Function

en.cppreference.com

 

어셈블리를 확인하고 싶다면 디버거를 실행후 확인하고 싶은 부분에서 우클릭후 Go To Disassembly로 가면 된다. 

6.11 콤마 연산자

for의 조건부분에서 콤마를 써서 조건을 여러개 나열 가능하다. 

(printf의 콤마(,)는 연산자가 아니라 단순 seperator임에 주의)

콤마연산자도 sequencepoint 로 작동한다. 

i++이 콤마를 만나면 시퀀스 포인트로 인식해서 1을 더한후 j에 i값을 대입함

콤마연산자로 표현된 expression은 가장 오른쪽에 있는값이 전체 연산의 값이다.
(대입연산자(=) expression의 값은 대입된 값이었던 것을 기억)

콤마로 나뉘어진 연산에서 y=2 가 가장 오른쪽에 있으므로 z 에는 y=2 expression의 값인 2가 대입.

int my_money = 123, 456; 는 에러가 뜨지만
int my_money = (123, 456); 는 괜찮다. 그이유는 괄호로 묶어서 콤마연산자 expression이 되기 때문. 대입은 위의 예시와 마찬가지로 가장 오른쪽인 456이 들어간다.  

6.13 탈출조건 루프 do while

do while 의 기본적인 작동법은 이하와 같다. 

6.15 중첩된 루프들

루프는 중첩해서 사용이 가능하다.

6.16 배열과 런타임 에러

scanf("%d", &my_numbers[0]); 는 scanf("%d", my_numbers); 와 같다. 이유는 지난 4.1강의 에서 나왔듯. my_number를 배열로 선언하면 my_numbers 자체가 메모리 주소이기 때문에 &를 쓸이유가 없음. 

다만 배열의 특정 인덱스에 접근할때는 scanf("%d", &my_numbers[1]); 이나 scanf("%d", &my_numbers[2]);처럼사용해야함.

 

런타임에러는 문법오류로 잡히지 않아서 컴파일 까지는 되지만 프로그램을 실행할때 문제가 발생

컴파일 타임에서 발생하는 문제는 대부분 문법문제

또한 배열크기를 넘어서는 인덱스에 접근하려하면  out of bounds 에러 발생

6.17 for 루프를 배열과 함께 사용하기

for와 배열은 이하와 같이 쓰면 편리하다. 

6.18 루프 안에서 함수의 반환값 사용하기

특정변수가 선언된 공간{}에서만 해당 변수를 사용할 수 있다는 점에 주의
이하의 예시 참조

int main()에 int i를 선언했더라도 위의 int compute() 함수에서는 i 밑에 빨간줄이 뜨며 에러가 난다. 

다른공간에서 선언된 변수는 다른 변수로 친다. 
이하의 예시 참조

int compute_pow(int base, int exp) 에서 선언된 reuslt와  int main() 에서 선언된 result는 각 함수의 공간{}내에서만 유효하다

또한 C에서는 함수를 프로토 타입으로 분리가 가능하다(=선언먼저 하고 함수의 내용은 나중에 작성)
이하의 예시참조

int compute_pow(int base, int exp)를 먼저 선언만 해두면 컴파일러가 나중에 아래에 작성해둔 함수의상세 설명을 자동으로 링킹 할수 있게 해줌. 

댓글