<C언어> 분기문과 루프문

1. C 언어 문장

C 언어의 문장은 세미콜론으로 ;끝납니다 .

C 문은 다음 다섯 가지 범주로 나눌 수 있습니다.

  1. 표현문
  2. 함수 호출 문
  3. 제어문
  4. 복합문
  5. 빈 문

이 장에서는 제어문에 대해 설명합니다.

제어문은 프로그램의 다양한 구조 모드(C 언어는 시퀀스 구조, 선택 구조, 루프 구조의 세 가지 구조를 지원함)를 구현하기 위해 프로그램의 실행 흐름을 제어하는 ​​데 사용되며 특정 명령문 정의자로 구성되며 C 언어는 9가지 유형의 제어문.

다음 세 가지 범주로 나눌 수 있습니다.

  1. if조건부 판단문은 분기 문이라고도 합니다 switch.
  2. 루프 실행 문: do while문, while문, for 문;
  3. 진술로 전환: break진술, goto진술, 계속 진술, return진술.

2. 분기문

2.1 if 문

C 프로그램을 작성할 때 다양한 조건에 따라 코드를 선택적으로 실행해야 하는 경우가 많습니다. 이것이 if 문이 하는 일입니다. if 문은 조건이 참인지 거짓인지에 따라 다른 코드 블록을 실행하는 조건문입니다.

if문의 기본 구문은 다음과 같습니다.

if (condition) {
    
    
    // 如果条件为真,执行这里的代码
}

if 문은 키워드 if, 괄호로 묶인 조건식 condition, 중괄호로 묶인 코드 블록으로 구성됩니다. 조건식이 평가됩니다. 결과가 참(0이 아님)이면 중괄호 안의 코드 블록이 실행되고, 결과가 거짓(0)이면 전체 if 문을 건너뛰고 후속 코드가 실행됩니다. 계속 처형됨.

다음은 if 문의 실행 흐름입니다.

  1. 조건식의 값을 결정합니다.
  2. 조건이 참이면 if 문의 코드 블록이 실행됩니다.
  3. 조건이 거짓이면 if 문의 코드 블록을 건너뛰고 후속 코드를 계속 실행합니다.

if-else문의 구문은 다음과 같습니다.

if (condition) {
    
    
    // 如果条件为真,执行这里的代码
} else {
    
    
    // 如果条件为假,执行这里的代码
}

다음은 if-else 문을 사용하는 예입니다.

int num = -5;

if (num > 0) {
    
    
    printf("Number is positive.\n");
} else {
    
    
    printf("Number is not positive.\n");
}

num위의 예에서 의 값에 따라 num0보다 크면 "Number is positive."를 출력하고, num0보다 크지 않으면 "Number is not positive."를 출력합니다.

다중 분기 구문은 else if다음과 같습니다.

if (condition1) {
    
    
    // 如果条件1为真,执行这里的代码
} else if (condition2) {
    
    
    // 如果条件1为假且条件2为真,执行这里的代码
} else {
    
    
    // 如果所有条件都为假,执行这里的代码
}

사용되는 경우 if 문 뒤와 문 앞에 else if위치해야 합니다 . else여러 else if를 사용하여 더 많은 조건부 분기를 추가할 수 있습니다.

else if다음은 사용 예 입니다 .

int score = 75;

if (score >= 90) {
    
    
    printf("优秀\n");
} else if (score >= 80) {
    
    
    printf("良好\n");
} else if (score >= 70) {
    
    
    printf("中等\n");
} else if (score >= 60) {
    
    
    printf("及格\n");
} else {
    
    
    printf("不及格\n");
}

score위의 예에서 변수의 값에 따라 점수 범위에 따라 다른 등급이 출력됩니다. 조건의 순서에 따라 조건을 만족하는 첫 번째 코드 블록만 실행됩니다. 90 보다 score크거나 같으면 "excellent"를 출력하고, 첫 번째 조건은 만족하지 않고 두 번째 조건(80 <= score < 90)을 만족하면 "good"을 출력하고, 90보다 크거나 같으면 "excellent"를 출력합니다.

C 언어 표현식에서 0은 false를 의미하고 0이 아닌 값은 true를 의미합니다 .

2.1.1 플로팅

이 코드를 작성할 때:

int main()
{
    
    
    int a = 0;
    int b = 2;
    if(a == 1)
        if(b == 2)
            printf("hehe\n");
    else
        printf("haha\n");
    return 0;
}
//注意程序中else不是跟第一个if匹配,而是和第二个匹配,所以a==1 为假,程序直接return 0;

C에서 else는 일치하지 않는 가장 가까운 if 문과 일치합니다.

개정:

//适当的使用{}可以使代码的逻辑更加清楚。
//代码风格很重要
#include <stdio.h>
int main() {
    
    
    int a = 0;
    int b = 2;
    if (a == 1) {
    
    
        if (b == 2) {
    
    
            printf("hehe\n");
        }
    } else {
    
       //else匹配左边的右括号的if
        printf("haha\n");
    }
    return 0;
}

2.1.2 if의 작성 ​​형식 비교

//代码1
if (condition) {
    
    
    return x;
}
return y;

//代码2
if (condition) 
{
    
    
    return x;
} 
else 
{
    
    
    return y;
}

//代码3
int num = 1;
if (num == 5) 
{
    
    
    printf("hehe\n");
}

//代码4
int num = 1;
if (5 == num) 
{
    
    
    printf("hehe\n");
}

2.2 스위치 문

switch표현식 값에 따라 다른 실행 경로를 선택하는 조건문입니다. if여러 문을 사용하는 것보다 가능한 여러 분기를 처리하는 더 간결하고 읽기 쉬운 방법을 제공합니다 .

switch문의 기본 구조는 다음과 같습니다.

switch (expression) {
    
    
    case constant1:
        // 执行代码块1
        break;
    case constant2:
        // 执行代码块2
        break;
    ...
    case constantN:
        // 执行代码块N
        break;
    default:
        // 当expression与上述常量都不匹配时执行的代码块
}

expression결과가 case각 명령문 뒤에 오는 상수와 비교되는 식입니다. expression의 값이 다음 case상수 중 하나와 일치하면 case명령문과 연결된 코드 블록이 실행됩니다. break이 명령문은 분기 실행 후 명령문 밖으로 점프하여 switch다음 분기 실행을 방지하는 데 사용됩니다.

switch다음은 진술에 대한 몇 가지 중요한 참고 사항 입니다 .

  1. expression의 결과는 float 또는 문자열이 아닌 정수 유형(예: int, char또는 )이어야 합니다.enum
  2. case다음 상수는 상수 표현식, 즉 컴파일 타임에 결정할 수 있는 값이어야 하며 변수가 될 수 없습니다.
  3. case분기의 코드 블록에는 여러 문이 포함될 수 있으며, 문이 없으면 break"케이스 침투"라고 하는 다음 분기를 계속 실행합니다.
  4. defaultexpression분기는 선택 사항이며 모두 case일치하는 항목이 없는 경우를 처리하는 데 사용됩니다 . 분기 가 없으면 default일치 항목이 없을 caseswitch명령문이 아무 작업도 수행하지 않습니다 .
  5. switch명령문은 다른 명령문 내에 중첩될 수 switch있지만 코드를 이해하기 어렵게 만드는 과도한 중첩을 피하도록 주의해야 합니다.

다음은 간단한 문의 예입니다 switch.

int day = 2;
switch (day) {
    
    
    case 1:
        printf("Monday\n");
        break;
    case 2:
        printf("Tuesday\n");
        break;
    case 3:
        printf("Wednesday\n");
        break;
    default:
        printf("Invalid day\n");
}

day이 예에서 변수 값에 따라 프로그램은 해당 출력, 즉 "화요일"을 인쇄합니다. 값이 1, 3 또는 다른 값 이면 day다른 출력이 인쇄됩니다. day값이 일치하지 않으면 case분기 default실행되고 "잘못된 날짜"가 인쇄됩니다.

문을 사용하면 switch식 값에 따라 여러 선택 항목 간에 빠르게 전환하고 해당 코드 블록을 실행할 수 있습니다.

2.2.1 스위치 중첩 사용

void test{
    
    
    int n = 1;
    int m = 2;
    switch (n) {
    
    
        case 1:
            m++;
        case 2:
            n++;
        case 3:
            switch (n) {
    
    //switch允许嵌套使用
                case 1:
                    n++;
                case 2:
                    m++;
                    n++;
                    break;
            }
        case 4:
            m++;
            break;
        default:
            break;
    }
    printf("m = %d, n = %d\n", m, n);
}
//输出结果:m = 5, n = 3
  • case"대소문자 침투" 효과를 달성하기 위해 명령문을 지속적으로 일치시킬 수 있습니다. 즉, 일치 항목이 발견된 후 명령문을 만나거나 명령문이 끝날 때까지 case후속 case명령문이 계속 실행됩니다 .breakswitch
  • switch명령문은 중첩되어 case하나의 명령문 내에서 명령문을 다시 사용할 수 있습니다 switch.
  • default분기는 선택 사항이며 일치하지 않는 모든 사례를 처리하는 데 사용됩니다.
  • 명령문을 사용할 때 switch제어 흐름의 흐름 방향에 주의하여 코드 논리가 올바른지 확인하십시오.

3. 루프 문

3.1 while 루프

while루프는 주어진 조건이 더 이상 충족되지 않을 때까지 코드 블록을 반복적으로 실행하는 데 사용되는 조건 기반 반복 구조입니다. 기본 구문은 다음과 같습니다.

while (condition) {
    
    
    // 循环体代码
    // 在每次迭代时执行的代码
}

condition식이며 일반적으로 부울 값과 관련된 조건입니다. true(0이 아님) 이면 condition루프 본문의 코드가 실행됩니다. 각 반복에서 condition먼저 판단을 하고 판단 결과가 참이면 루프 본문의 코드가 실행됩니다. 그런 다음 다시 확인하여 condition다음 반복으로 진행할지 여부를 결정합니다. condition루프는 true로 유지되는 한 계속 실행됩니다.

while루프의 실행은 다음과 같습니다.

  1. 확인된 condition값입니다.
  2. false(0) 이면 condition루프가 종료되고 루프 본문의 코드가 실행되지 않습니다.
  3. 참 이면 condition(0이 아님) 루프 본문의 코드가 실행됩니다.
  4. condition1단계로 돌아가서 값을 계속 확인 하고 판단 결과에 따라 루프를 계속 실행할지 여부를 결정합니다.

while다음은 루프 사용을 보여주는 간단한 예입니다 .

int count = 0;
while (count < 5) {
    
    
    printf("Count: %d\n", count);
    count++;
}

이 예에서는 count초기값이 0인 변수가 정의됩니다. 그런 다음 조건을 while확인하면서 루프 에 들어갑니다. count < 5초기값이 0이므로 조건이 성립하므로 루프 본문의 코드가 실행됩니다. 현재 count값은 루프 본문에 인쇄된 다음 count증가합니다. while그런 다음 루프의 시작 부분 으로 돌아가 조건을 다시 확인하고 count의 값이 더 이상 5보다 작지 않을 때까지 위 단계를 반복합니다.

3.1.1 while 루프에서 중단 및 계속

while루프 내에서 breakand continue문을 사용하여 루프의 동작을 제어할 수 있습니다.

  1. break명령문: 루프에서 명령문이 발견되면 break프로그램은 즉시 루프를 종료하고 루프 이후에 코드를 계속 실행합니다. 나머지 반복을 실행하지 않고 조기에 루프를 종료하는 데 사용됩니다.

break다음은 문을 사용하는 예 입니다 .

int i = 0;
while (i < 5) {
    
    
    if (i == 3) {
    
    
        break;
    }
    printf("%d ", i);
    i++;
}

이 예에서는 i의 값이 3 과 같을 때 명령문이 발견되었습니다 break. 이 시점에서 루프가 종료되고 더 이상 반복이 수행되지 않습니다. 따라서 출력은 다음과 같습니다.

0 1 2

2. continue명령문: 루프에서 명령문이 발견되면 continue프로그램은 현재 반복의 나머지 코드를 즉시 건너뛰고 바로 다음 반복으로 들어갑니다. 루프를 종료하지 않고 일부 특정 반복을 건너뛰는 데 사용됩니다.

continue다음은 문을 사용하는 예 입니다 .

continue다음은 문을 사용하는 예 입니다 .

int i = 0;
while (i < 5) {
    
    
    i++;
    if (i == 3) {
    
    
        continue;
    }
    printf("%d ", i);
}

이 예에서는 i의 값이 3 과 같을 때 명령문이 발견되었습니다 continue. 이 시점에서 printf현재 반복에서 명령문 뒤의 코드는 건너뛰고 바로 다음 반복으로 이동합니다. 따라서 출력은 다음과 같습니다.

1 2 4 5

break참고: and 문을 사용할 때 continue무한 루프나 논리 오류가 발생하지 않도록 주의하십시오. 의도한 제어 흐름을 달성하기 위해 적절한 조건에서 이러한 문을 사용해야 합니다.

몇 가지 코드를 관찰하십시오.

#include <stdio.h>
int main() {
    
    
    int ch = 0;
    while ((ch = getchar()) != EOF)
        putchar(ch);
    return 0;
}
//这里的代码适当的修改是可以用来清理缓冲区的.

#include <stdio.h>
int main() {
    
    
    char ch = '\0';
    while ((ch = getchar()) != EOF) {
    
    
        if (ch < '0' || ch > '9')
            continue;
        putchar(ch);
    }
    return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的

3.2 while 루프 수행

do...while루프는 루프 조건을 확인하기 전에 루프 본문의 코드를 실행하는 사후 테스트 루핑 구조입니다. 루프 조건이 더 이상 충족되지 않을 때까지 루프 조건이 충족되는 한 루프 본문의 실행이 계속됩니다. do...while루프는 처음부터 루프 조건이 충족되지 않더라도 루프 본문을 적어도 한 번 실행합니다.

do...while루프의 기본 구문은 다음과 같습니다.

do {
    // 循环体代码
    // 在每次迭代时执行的代码
} while (condition);

먼저 do키워드 뒤에 오는 루프 본문의 코드가 한 번 실행됩니다. 그런 다음 루프 본문을 한 번 실행한 후 프로그램이 루프 조건을 확인합니다 condition. 루프 조건이 참(0이 아님)인 경우 실행은 다음 반복으로 계속 진행되어 루프 본문의 코드를 다시 실행합니다. 루프 조건이 거짓(0)이면 루프를 종료하고 루프 다음에 코드를 계속 실행합니다.

do...while다음은 루프 사용을 보여주는 간단한 예입니다 .

int count = 0;
do {
    
    
    printf("Count: %d\n", count);
    count++;
} while (count < 5);

이 예제에서는 루프의 본문이 한 번 실행되어 초기 count값을 인쇄합니다. 그런 다음 루프 조건을 확인 count < 5하고 충족되면 다음 반복으로 진행합니다. 반복할 때마다 현재 값을 출력한 count다음 count증가시킵니다. 루프는 count의 값이 더 이상 5보다 작지 않을 때까지 계속됩니다.

3.2.1 do while 루프에서 중단 및 계속

do...while루프에서 breakand continue문의 사용법과 기능은 forand 와 같은 다른 루프 구조 while의 사용법과 기능과 동일합니다 . 루프의 실행 흐름을 제어하기 위해 루프 본문 내에서 사용됩니다.

  1. break명령문: 루프에서 명령문이 발견되면 break프로그램은 현재 루프를 즉시 종료하고 나머지 반복을 실행하지 않고 루프 이후의 코드를 계속 실행합니다.

break다음은 문을 사용하는 예 입니다 .

int i = 0;
do {
    
    
    if (i == 3) {
    
    
        break;
    }
    printf("%d ", i);
    i++;
} while (i < 5);

이 예제에서는 i의 값이 3 과 같을 때 명령문이 발생합니다 break. 이 시점에서 루프가 종료되고 더 이상 반복이 수행되지 않습니다. 따라서 출력은 다음과 같습니다.

0 1 2
  1. continue명령문: 루프에서 명령문이 발견되면 continue프로그램은 현재 반복의 나머지 코드를 즉시 건너뛰고 바로 다음 반복으로 이동합니다.

continue다음은 문을 사용하는 예 입니다 .

int i = 0;
do {
    
    
    i++;
    if (i == 3) {
    
    
        continue;
    }
    printf("%d ", i);
} while (i < 5);

이 예제에서는 i의 값이 3 과 같을 때 명령문이 발생합니다 continue. 이 시점에서 printf현재 반복에서 명령문 뒤에 오는 코드는 건너뛰고 다음 반복으로 바로 이동합니다. 따라서 출력은 다음과 같습니다.

1 2 4 5

3.3 for 루프

for루프는 코드 조각을 반복적으로 실행하는 데 사용되는 일반적으로 사용되는 루프 구조로, 초기화 표현식, 루프 조건 및 루프 반복문의 세 부분으로 구성됩니다.

for루프의 기본 구문은 다음과 같습니다.

for (初始化表达式; 循环条件; 循环迭代语句) {
    
    
    // 循环体代码
    // 在每次迭代时执行的代码
}
  1. 일반적으로 루프 변수를 초기화하는 데 사용되는 초기화 표현식을 실행합니다.
  2. 루프 조건이 확인되고 루프 조건이 참이면(0이 아님) 루프 본문 내부의 코드가 실행됩니다. 루프 조건이 거짓(0)이면 루프를 종료하고 루프 다음에 코드를 계속 실행합니다.
  3. 루프 본문 내에서 코드를 실행합니다.
  4. 일반적으로 루프 변수의 값을 업데이트하는 데 사용되는 루프 반복문을 실행합니다.
  5. 두 번째 단계로 돌아가서 루프 조건을 다시 확인한 다음 루프 조건의 결과에 따라 루프를 계속할지 여부를 결정합니다.

for다음은 루프 사용을 보여주는 간단한 예입니다.

for (int i = 0; i < 5; i++) {
    
    
    printf("%d ", i);
}

이 예에서 초기화 표현식은 int i = 0루프 변수를 i초기값 0으로 초기화합니다. 루프 조건은 변수가 5보다 작은지 i < 5확인하고 i, 그렇다면 루프 본문의 코드를 실행합니다. 반복할 때마다 현재 i값을 출력합니다. 루프 반복문은 루프 변수의 값을 i++증가시키는 데 사용됩니다 . i루프 조건이 더 이상 충족되지 않을 때까지 루프가 계속됩니다.

이 코드는 다음을 출력합니다.

0 1 2 3 4

3.3.1 for 루프 대 while 루프

int i = 0;
//实现相同的功能,使用while
i = 1;         //初始化部分
while (i <= 10)//判断部分
{
    
    
    printf("hehe\n");
    i = i + 1;//调整部分
}

//实现相同的功能,使用for
for (i = 1; i <= 10; i++) {
    
    
    printf("hehe\n");
}

while여전히 순환에는 세 가지 필수 조건이 있지만 스타일 문제로 인해 세 부분이 멀리 벗어날 수 있으므로 검색 및 수정이 집중되지 않고 편리하지 않습니다 . 따라서 for루핑 스타일이 더 좋고 for루핑 빈도도 가장 높습니다.

3.3.2 for 루프에서 중단 및 계속

for루프 에서 breakand 문의 사용법과 효과는 and 와 continue같은 다른 루프 구성 과 동일합니다 .whiledo...while

//代码1
int main() {
    
    
    int i = 0;
    for (i = 1; i <= 10; i++) {
    
    
        if (i == 5)
            break;
        printf("%d ", i);
    }
    return 0;
}
//输出结果:1 2 3 4

//代码2
int main() {
    
    
    int i = 0;
    for (i = 1; i <= 10; i++) {
    
    
        if (i == 5)
            continue;
        printf("%d ", i);
    }
    return 0;
}
//输出结果:1 2 3 4 6 7 8 9 10

3.3.3 for 루프의 루프 제어 변수

제안:

  1. for 루프가 통제 불능 상태가 되는 것을 방지하기 위해 for 루프 본문의 루프 변수를 수정하지 마십시오.
  2. for 문의 루프 제어 변수의 값은 "먼저 닫은 후 열린 간격" 방식으로 작성하는 것이 좋습니다.
int i = 0;
//前闭后开的写法
for (i = 0; i < 10; i++) {
    
    }
//两边都是闭区间
for (i = 0; i <= 9; i++) {
    
    }

3.3.4 for 루프의 변형

for (;;) {
    
    
    printf("hehe\n");
}

for 루프에서 초기화 부분, 판단 부분, 조정 부분은 생략할 수 있지만, 문제가 생기기 쉬우므로 초보자에게는 생략하는 것을 권장하지 않습니다.

초기화 부분을 생략하면 여기에 hehe가 몇 개나 인쇄되나요?

int i = 0;
int j = 0;
for (i = 0; i < 10; i++) {
    
    
    for (j = 0; j < 10; j++) {
    
    
        printf("hehe\n");
    }
}
//100次hehe

초기화 부분을 생략하면 여기에 hehe가 몇 개나 인쇄되나요?

int i = 0;
int j = 0;
for (; i < 10; i++) {
    
    
    for (; j < 10; j++) {
    
    
        printf("hehe\n");
    }
}
//10次heh

둘 이상의 변수가 있는 제어 루프

int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) {
    
    
    printf("hehe\n");
}
//2次hehe

관행:

반복 횟수를 물어봐도 될까요?

int main() {
    
    
    int i = 0;
    int k = 0;
    for (i = 0, k = 0; k = 0; i++, k++)
        k++;
    return 0;
}

이 프로그램의 루프 횟수는 0회입니다.

for 루프의 조건 부분에서 등호 연산자(==) 대신 대입 연산자(=)가 사용되어 조건이 항상 참(0이 아님)이 되므로 루프가 무한히 실행됩니다. 루프 본체에서는 k에 대해 자체 증가 연산(k++)이 수행되지만 루프 조건에서는 k 값이 0으로 재할당되므로 각 루프가 끝날 때마다 k 값이 0으로 재설정됩니다. 따라서 루프는 절대 종료될 수 없으며 프로그램은 무한 루프 상태에 빠져서 0을 반환하지 않습니다.

4. goto 문

C언어에서는 goto프로그램에서 무조건 레이블로 옮기기 위해 문을 사용한다. 현재 기능 또는 블록 내를 포함하여 프로그램의 모든 위치로 이동할 수 있습니다.

goto다음은 명령문의 사용법을 보여주는 예제 프로그램입니다 .

#include <stdio.h>

int main() {
    
    
    int i = 0;

    start:
    printf("i = %d\n", i);
    i++;

    if (i < 5) {
    
    
        goto start;
    }

    return 0;
}

명령문을 잘못 사용하면 goto코드를 이해하고 유지하기 어렵게 만들 수 있으므로 주의해서 사용해야 합니다. 종종 루프 및 조건문(예 for: , while, if등)을 명령문 대신 사용하여 goto코드를 보다 구조화하고 읽기 쉽게 만들 수 있습니다.

Supongo que te gusta

Origin blog.csdn.net/ikun66666/article/details/131301721
Recomendado
Clasificación