조무위키
조무위키
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
도구
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
행위
문서
토론
편집
역사 보기
C언어
편집하기 (부분)
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
===제어문=== ---- '''C언어 입문 통틀어서 매우 중요도 높음 이거 모르면 프로그램 못짠다''' 제어문은 말그대로 프로그램의 흐름을 제어하는 구문들이다. 조건문 반복문 goto문이 존재한다. (혹시 빠트린거 있으면 추가바람) '''제어문 옆에 세미콜론 붙이는거 아님''' 조건문의 종류로는 if, else if, else, switch-case 문이 존재한다. if문은 대표적인 조건문으로 if( 조건 ) { 명령 } 이런 구성이다. 조건이 참일경우 ( 1일 경우 (조건 연산자가 1과 0을 반환하는 이유 중 하나) ) 중괄호 사이의 명령을 실행한다. 예를들어 var 이라는 변수가 5보다 크고 10보다 작을경우 Hello를 출력해보자 if( var > 5 && var < 10 ) { printf(<nowiki>"Hello\n"</nowiki>); '''// 부들부들.. 왜 요즘 애들은 이 좋은 puts 함수를 모르는 거냐? puts(<nowiki>"Hello"</nowiki>);''' //puts가르쳐놓고 변수출력하라할거냐? 문자열만 출력한답시고 puts랑 printf랑 번갈아가면서 쓰면 맛보기로 보는데 참 좋아라하겠다 } 이러한데 제어문은 실행할 명령이 1줄 일경우 굳이 중괄호를 치지 않아도 된다. if( var > 5 && var < 10 ) printf(<nowiki>"Hello\n"</nowiki>); 이렇게 조건을 걸어 참일 경우 특정 명령을 실행할 수 있다. 그런데 만약 다른 예외의 경우가 있다고 한다면 if 문을 또 써야할텐데 그럴때는 else if 문을 사용할 수 있다 if문과 사용방법은 같지만 if문 뒤에 와야한다. 예를들어 var 이 10과 같거나 크고 15보다 작을 때 Welcome 을 출력한다면 if( var > 5 && var < 10 ) printf(<nowiki>"Hello\n"</nowiki>); else if( var >= 10 && var < 15 ) printf(<nowiki>"Welcome\n"</nowiki>); 이처럼 예외를 만들어 줄 수 있다. 다만 두개의 조건이 거짓일때 Bye라고 해줘야한다면 일일히 조건걸기 매우 힘들것이다. else문을 사용하여 쉽게 만들 수 있는데 else문은 if, else if 에서 나온 조건들이 전부 거짓일경우 중괄호 안 혹은 한줄의 경우 바로 밑 명령을 실행한다. if( var > 5 && var < 10 ) printf(<nowiki>"Hello\n"</nowiki>); else if( var >= 10 && var < 15 ) printf(<nowiki>"Welcome\n"</nowiki>); else printf(<nowiki>"Bye\n"</nowiki>); 위에서도 말했지만, if문 옆에 세미콜론(;) 절대 붙이지마라. 안그러면 조건에 맞지 않는데도 if문 안이 실행되서 엥? 하기 때문이다. switch문은 어떤 한 변수를 두고 그 변수가 무슨 값이냐에 따라 하나를 선택하는데 다중 선택 제어문 이라고도 부른다 switch(변수) { case 값1: 명령 break; case 값2: 명령 break; } 이런식으로 구성되는데 예를들어 한 게임의 scene에 따라 화면 구성을 바꾸려고하는데 1은 시작화면 2는 대기화면 3번은 게임화면이라고 하자. switch(scene) { case 1: //시작화면 break; case 2: //대기화면 break; case 3: //게임화면 break; } 이렇게 나누면 아주 좋다 break문으로 switch를 빠져나가는데 나중에 배울 반복문에도 사용가능하다. 참고로 break;문을 해주지 않으면 어떻게 되는지는 예를들어 설명하겠다. switch(scene) { case 1: //시작화면 break; case 2: //대기화면 case 3: //게임화면 break; } 현재 이런식으로 된 스윗치문이 있다고하면 2번 case에는 break; 가 없다 이경우 실행해보면 3번 case 까지 실행하는데 아마도 하나의 케이스를 찾으면 그 다음 케이스 부터는 무조건 참으로 들어가 명령을 실행한다 보면된다. 작성자들 고마워! 위키 보면서 제일 쓸모있는 문서같다 추가 제발 while(a>3)이 된다고 switch(a>3)도 되겠지? 하지마라. 반복문은 말그대로 반복하는 구문인데 활용도가 굉장히 높고 안쓰이는 프로그램을 찾아보기 힘들 정도로 대부분에 사용된다. 어느정도 배웠던 혹은 위를 천천히 읽어본 독자는 printf 라는 함수로 간접적으로 메세지를 출력하는 방법을 알았을 것이다. 어느날 시험으로 Hello, World! 를 100번 출력하라는 문제가 제출되었다고 하면. 반복문을 배우지 않은 사람은 printf(<nowiki>"Hello, World!\n"</nowiki>); 를 100번 쓰기위해 Ctrl+C, V를 남발할 것이며, 적어도 소스가 100줄이상은 나올것이다. 만약 컴파일러에게 저 문장을 100번 반복해 라고 하면 얼마나 편할까? 반복문은 for, while , do while 이 존재한다. for문은 for을 쓰고 소괄호 안에 초기식 ; 조건식 ; 증감식 이 되어 이 식들에 따라 괄호안에 있는 문구를 반복한다. 즉 for(초기식;조건식;증감식) 이런식으로 작성되고 ;(세미콜론) 은 각 식들의 구분점이 된다. (그리고 초기문 증감문 증감문 으로 하든 뭐라하든 개념만 잡히면 되므로 별로 명칭은 중요하지 않다.) '''주의 ) 가끔씩 for(초기식;조건식;증감식); 이런식으로 끝에 ;를 붙이는 사람이 있는데 그러면 중괄호 내용이 반복되지 않는다''' ''' ;은 문장의 끝을 알려주는 역할로 알면 쉬운데 말그대로 { }가 닿기전 for문 끝에 ; 에 의해 for문이 지혼자 반복하다가 끝나고''' ''' { } 안에 있는 내용은 그냥 하나의 블록이 되어 한번 실행하고 넘어간다.''' ''' 허나 프로그램 지연(Delay)을 위해 사용되기도 하는데 어처피 다 Windows.h 불러와서 Sleep 함수 쓰거나 다른 처리를 하므로 ''' ''' 실질적으로 Delay를 이렇게 주진 않는다고 보면 된다. (허나 어느 강의에서는 가르치기도 하고 좋은 경험이 될 수 있으므로 봐두는게 좋음''' 백문이 불여일견 예시를 작성하자면 int var; for(var = 0;var<100;var++) { printf(<nowiki>"Hello, World!\n"</nowiki>); } 자 한번 정리해서 보자 초기식 : var = 0 조건식 : var<100 증감식 : var++ => var=var+1 (1씩더해주는것이다 두개 의미는 같다.) ㄴ 미묘하게 다르다. var++의 값은 var이지만 var=var+1의 값은 var+1이다. 여기서 기능상 차이는 없지만 같은 의미를 고집하고 싶으면 ++var을 쓰면 된다. 초기식은 말그대로 반복하기에 앞서 맨처음 실행되는 식이다 이때 var에 0이 대입되어 var이라는 공간안에는 0라는 값이 들어있다. (0도 값이다) 조건식은 반복문이 중괄호 { } 의 내용을 실행할지 말지를 결정하는 조건이 되며 참 일경우 실행 거짓 일경우 for문 실행을 중단하고 그 다음 구문으로 넘어간다. 조건식은 중괄호의 내용이 한번 반복할때마다 실행되며, for문이 초기식을 실행하고 조건식을 걸쳐 { } 사이의 내용이 실행된 다음 증감식 실행 후 조건식 실행 후 { } 실행 이 반복된다. 초기식 조건식 { } 실행 증감식 조건식 { } 실행 증감식 조건식 { } 실행 ... // 이런식의 반복이다. 증감식은 말그대로 변수를 증가 감소 시키기위해 사용되는 식인데 사실 무조건 증가 감소만 되는게아니라 곱하기 나누기도 되며 심지어 함수 호출도 된다! 그리고 초기식과 증감식은 , 연산자로 두개 이상하는것도 가능하다 ( for(var1=0,var2=0;var1<=100;var1++,var2++) 이렇게 (보기어려우면 ;를 구분해서 봐라)) 두개의 조건식을 원한다면 논리 연산자를 사용하는것이 좋다. ( x == 1 && y == 2 ) (예시를 좀더 간단히 쓴다면 for(var=0;var<100;var++,printf(<nowiki>"Hello, World!\n"</nowiki>)); 이렇게써도 된다 다만 99번출력되므로 알아서 조건식 1더하던가 해라) 증감식은 대체로 반복문을 중단시키기 위한 용도로 사용되는 경우가 많다. 증감식에서 변수를 증가하거나 감소시켜 원할때 조건문을 참, 거짓으로 만들어 원하는 작업을 실행할 수 있다. 그리고 조건 연산자를 얘기할때 참일경우 1 거짓일경우 0으로 나타낸다고 했는데 그 조건연산자를 조건문에서 실행하는 것으로 보아 조건문에는 실질적으로 1 혹은 0 이 들어갈 수 있음을 유추할 수 있는데. for(;1;) 이렇게 될경우 무조건 조건식이 참(1) 이 되므로 { } 에 있는 명령을 무한 반복한다. (무한루프라고 부름) for(;0;) 은 무조건 거짓이므로 반복 될 수 없으며 조건식을 거치지 못했으므로 { } 의 명령은 한번마저도 실행될 수 없다. 다만 for(;;) 이라 해도 무한반복 한다. 무한 반복은 거의 쓸모없어 보이나, 의외로 쓰는 사람이 꽤 있는데 게임만드는 사람은 공부할적에 한번씩 써봤을 것이다. 이유라 하면 상대방의 입력을 받고 화면에 출력하며 끄라는 명령이 언제 내려질지 모르므로 무한 반복해놓고 나중에 사용자가 끌려고 할 때 break 문이라는 것으로 무한반복되는 반복문을 빠져나간다. break; 문은 단어에서 오는 느낌 그대로 반복문을 깨버린다. (다만 반복문에 한정되지 않고 switch에서도 사용된다.) 예시를 들자면 조건문을 비워둔 상태(무한반복) 에서 그 반복문을 나가야 할 경우 int var; for(var = 0;;var++) { if(var >= 100) // 또는 if(var == 100) 해도 별로 상관은 없다. break; printf(<nowiki>"Hello, World!\n"</nowiki>); } 이렇게 무한루프에서 빠져나올 수 있다. break와 자매품으로 continue가 있는데 이건 break처럼 반복문을 한번 나오고 끝이 아니라 밑의 내용을 실행하지 않고 바로 다음 반복을 실행한다. 이게 뭔말이냐 하면 만약 짝수 (2의 배수) 일 경우 Hello, World!를 출력을 못하게 하려 한다면 int var; for(var = 0;;var++) { if(var % 2 == 0 && var != 0) continue; printf(<nowiki>"Hello, World!\n"</nowiki>); } var % 2 == 0 에서 조금 헷갈릴 수 있는데 %는 나머지 연산자이며 좌항을 우항으로 나눈 나머지를 연산해주고 그 나머지가 0이라면( == 0 ) 그리고 논리연산자 &&(AND) 가 붙음으로 var의 값이 나머지가 0이고 var의 값이 0이 아니라면 (var != 0) continue;가 실행되 바로 다음 반복으로 간다. ( 밑의 printf는 호출되지 않고 바로 넘어가서 증감문->조건식->{ } 실행 ->증감문->조건식 ...) 반복문은 for뿐만 아니라 while도 있는데 while문은 소괄호 안에 조건식만 있는 간단한 형태임 while(조건식) { ... } 이런식인데 초기식과 증감식이 없는 관계로 따로 추가해줘야된다. 초기식 while(조건식) { ...//명령 증감식 } 이런식의 배치를 하면 for문과 같은 순서로 실행 가능하다. while과 for문 어느것을 쓸지는 이러저리 말이 많은데 그냥 꼴리는대로 쓰면 된다. do while 문도 존재하는데 for문이나 while문은 처음 반복 시작할때도 조건이 거짓이면 실행조차 되지않는데, 무조건 한번은 명령이 실행되어야 할 경우에 사용한다. do { 명령 } while(조건식); 이렇게 쓰면된다. 세상에는 여러 작업들이 있는만큼 반복하면서 또 반복해야 할 경우도 많은데 예를들어 창문을 닦을때 창문이 10개라고 가정할때 반복문 10번 돌게하고 창문을 닦는 명령을 하면되는데 창문을 닦을때 분무기를 3~4 번 뿌리고 신문으로 닦는다고 가정하자 그러면 반복문안에 반복문이 또 들어가는 상황이 연출되는데 그것을 이중루프 또는 다중루프 라고 한다. 한번 예시를 작성해보자 int var1,var2; for(var1=0;var1<10;var1++) { for(var2=0;var2<4;var2++) { 분무기 칙칙 } 창문 닦기 } 반복문 안에 또 반복문이 있는 형태인데 약간 머리가 어지러울 수 있으니 어떻게 진행되는지 천천히 잘 생각해라. 반복문 1 시작 (초기식->조건식) 반복문 2 시작 (초기식->조건식) 분무기 칙칙 반복문 2 (증감식->조건식) 분무기 칙칙 반복문 2 (증감식->조건식) 분무기 칙칙 반복문 2 (증감식->조건식) 분무기 칙칙 반복문 2 (증감식->조건식) (4번돌아 var이 4가 되었으므로 거짓이 되고 반복문을 빠져나옴) 창문닦기 반복문 1 (증감식->조건식) 반복문 2 시작 (초기식->조건식) 분무기 칙칙 반복문 2 (증감식->조건식) ... 이렇게 진행된다 글로적기 좀 뭐한감이 있는데. 1번째 반복문이 n번을 돌때 2번째 반복문이 m번을 돈다하면 2번째 반복문은 총 n*m번을 돌게된다 즉 하고싶은 말은 1번째 반복문에 의해 2번째 반복문이 반복된다는 말이다. goto문은 강력한 흐름제어문인데 웬만하면 안쓰는게 좋다. goto문을 남발할경우 C언어의 특징인 절차적임을 잃고 흐름이 중구난방하게 꼬인다. 그에따라 가독성도 나빠지고 작성하기도 꽤 곤란해지는 경우가 많다. 사용법은 특정한 지점에서 적당한 이름짓고 :를 붙여서 나중에 필요할때 goto 이름; 하면 그 특정한 지점으로 이동하여 다음 명령을 실행한다. 반복된 루프에서 한번에 빠져나가기 곤란할때 꽤 유용하다. (break문은 한번에 하나의 루프를 빠져나간다.)
요약:
조무위키에서의 모든 기여는 CC BY-SA 4.0 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
조무위키:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)