第五幕:C语言基础篇之C语句(控制语句、函数调用语句、表达式语句、空语句、复合语句、赋值语句,声明部分和执行部分解释、计算机编程中副作用的解释)

您所在的位置:网站首页 if空语句 第五幕:C语言基础篇之C语句(控制语句、函数调用语句、表达式语句、空语句、复合语句、赋值语句,声明部分和执行部分解释、计算机编程中副作用的解释)

第五幕:C语言基础篇之C语句(控制语句、函数调用语句、表达式语句、空语句、复合语句、赋值语句,声明部分和执行部分解释、计算机编程中副作用的解释)

2024-07-01 21:13| 来源: 网络整理| 查看: 265

一、说明

        在C语言中,术语“C语句”通常指的是一组按照C语法规则编写的指令,用于执行特定的操作。C语句是C程序的基本组成单位之一,它们可以单独使用或组合在一起形成更复杂的逻辑结构。  在C语言中一个函数包含声明部分和执行部分,执行部分是由语句组成的,语句的作用是向计算机系统发出指令,然后计算机执行相应的操作。一个C语句经过编译后产生若干条机器指令。声明部分不是语句,不会产生机器指令,只是对有关的数据进行声明。(本文最后会详细的讲解一下什么是声明部分,什么是执行部分,各位小伙伴们请耐心的观看哦!)

        C语句的特点包括:

        1. 基本形式:C语句通常以分号(;)结尾。单个语句可以占据一行或多行。

        2. 功能:C语句用于执行各种任务,包括但不限于赋值、条件判断、循环、函数调用、控制流程等。

        3. 语句类型:C语言中的语句可以根据其功能和用途进行分类,包括表达式语句、复合语句、选择语句、循环语句、跳转语句等。

        4. 组合性:C语句可以单独使用,也可以按照一定的逻辑组合在一起形成复杂的程序结构。

例如,下面是一些常见的C语句示例:

int x = 10; // 声明并初始化变量的赋值语句 if (x > 5) { // 条件语句 printf("x is greater than 5.\n"); // 函数调用语句 } else { printf("x is not greater than 5.\n"); }

        在这个示例中,第一行是一个赋值语句,用于声明并初始化变量x。接下来是一个条件语句,根据x的值判断输出不同的消息。在条件为真时,调用了printf函数打印消息;在条件为假时,也调用了printf函数打印消息。这些都是C语句的示例。

        简单点来说:

        C语句是在C语言中用于执行特定任务的指令或命令。它们是程序中的基本构建块,用于执行各种操作,例如赋值、条件判断、循环、函数调用等。C语句按照语法规则组织,以分号(;)结尾。单个语句可以占据一行或多行。

        更简单点来说:

        C语句就是一系列按照C语言语法规则编写的指令,用于执行特定的操作,控制程序的逻辑流程,实现各种功能。

     (下面我们来具体探讨一下不同的C语句和它们的作用)

二、C语句的分类和作用 1、控制语句

        说明:控制语句是C语言中用于控制程序流程的语句,它们允许根据条件执行特定的代码块或者多次执行相同的代码块,控制语句包括条件语句和循环语句。

(1) 条件语句:                    if语句:

        用于根据条件执行特定的代码块。

if (condition) { // 当条件为真时执行的代码 }         if-else语句:

        在条件为真时执行一个代码块,在条件为假时执行另一个代码块。

if (condition) { // 当条件为真时执行的代码 } else { // 当条件为假时执行的代码 }

        注意:在使用' if '语句和' else '语句时,要确保一个' if '语句后面紧跟一个' else '语句,' else '语句会和最近的' if '语句配对。

        正确的例子:

int x = 5; if (x > 0) { printf("x is positive\n"); } else { printf("x is non-positive\n"); }

错误的例子:  

int x = 5; if (x > 0) { printf("x is positive\n"); } printf("This line is not part of the if-else block\n"); else { printf("x is non-positive\n"); // Error: "else" without a previous "if" }

在上面的错误的例子中,' else '语句与最近的' if '语句没有匹配,因为' if '语句后面跟着一条语句后立即出现的另一个' printf '语句。因此,编译器会报错:"else" without a previous "if".         修改:

int x = 5; if (x > 0) { printf("x is positive\n"); printf("This line is not part of the if-else block\n"); } else { printf("x is non-positive\n"); }                  嵌套if语句:

        if语句可以嵌套在另一个if语句内部,以实现更复杂的条件逻辑。

if (condition1) { if (condition2) { // 当condition1和condition2都为真时执行的代码 } }

(2) 循环语句:

        说明:循环语句是C语言中用于重复执行一段代码块的语句。它允许程序根据条件多次执行相同或不同的代码,从而实现对重复性任务的处理。

        while循环:

        在条件为真时重复执行一段代码块。

while (condition) { // 循环体内的代码 }         do-while循环:

        先执行一次代码块,然后在条件为真时重复执行。

do { // 循环体内的代码 } while (condition);         for循环:

        用于指定循环次数的循环结构。

for (initialization; condition; increment) { // 循环体内的代码 }

   其中,初始化表达式在循环开始前执行一次,条件表达式在每次循环迭代前进行测试,增量表达式在每次循环迭代之后执行。

(3)跳转语句:         break语句:

        用于跳出循环或者switch语句。

        代码示例:

#include int main() { for (int i = 0; i < 10; i++) { printf("%d ", i); if (i == 5) break; } printf("\n"); return 0; }

在上述示例中,当 i 的值等于 5 时,break 语句被执行,导致程序跳出循环。        

        continue语句:

        用于结束当前循环的迭代,过循环体内剩余的代码,并跳到下一次循环的迭代开始处。         代码示例:

#include int main() { for (int i = 0; i < 10; i++) { if (i % 2 == 0) continue; printf("%d ", i); } printf("\n"); return 0; }

        在上述示例中,当 i 为偶数事,continue语句被执行,导致跳过printf 语句直接开始下一次循环迭代。

                 return语句:

        用于从函数中返回值,并结束函数的执行。         代码示例:

#include int add(int a, int b) { return a + b; } int main() { int sum = add(3, 5); printf("Sum: %d\n", sum); return 0; }

        在上述示例中,return语句用于从add函数中返回计算的结果,并结束函数的执行。

       

        goto语句:

        用于无条件地将控制转移到程序中的指定( label )位置。

        语法格式:

goto label;

        代码示例:

#include int main() { int i = 0; loop_start: printf("%d ", i); i++; if (i < 5) goto loop_start; printf("\n"); return 0; }

        在上述示例中使用goto语句将程序跳转到标记loop_start所指定的位置,从而实现了循环输出数字的功能。         

2、函数调用语句

        说明:当涉及到C语言中的函数调用语句时,我们通常涉及到函数的声明、定义和调用。下面就让我来详细解释这些概念:

        (1)函数声明 (Function Declaration):

        函数声明是对函数的原型进行说明,包括函数的返回类型、函数名和参数列表。函数声明通常在文件的开头或者头文件中。其目的是为了在函数调用时告知编译器函数的存在及其参数类型。

// 函数声明示例 int add(int a, int b); // 声明一个名为add的函数,接受两个int类型参数,返回int类型值         (2)函数定义 (Function Definition):

        函数定义提供了函数的实际实现,包括函数的代码块。在函数定义中,你将实现函数的功能并定义变量。函数定义包括函数的返回类型、函数名、参数列表和函数体。

// 函数定义示例 int add(int a, int b) { // 定义一个名为add的函数,接受两个int类型参数,返回int类型值 return a + b; // 返回两个参数的和 }         (3)函数调用 (Function Call):

        函数调用是指在程序中执行函数的过程。在调用函数时,你需要提供函数所需的参数。函数调用语句通常在程序的某个地方,并且会调用相应的函数来执行特定的任务。

// 函数调用示例 int result = add(5, 3); // 调用名为add的函数,并传入参数5和3,将返回值存储在result变量中

        重要注意事项:

        - 函数声明和函数定义必须在函数调用之前。         - 函数调用语句中的参数数量和类型必须与函数声明或定义中的参数数量和类型相匹配。         - 函数调用会将程序的执行流程转移到被调用函数的代码中执行,执行完毕后将返回结果给调用方。         - 函数的返回值可以是任何基本数据类型,也可以是指针或者结构体等数据类型。

3、表达式语句

        说明:表达式语句是C语言中的一种语句类型,它由一个表达式组成,以分号结尾。表达式语句通常用于执行一些操作或计算,并且可以修改程序的状态。下面我会详细讲解表达式语句的特点、用法和示例:

        (1)特点:

        - 表达式语句执行表达式,并可以有副作用,例如:修改变量的值、调用函数、执行赋值操作等。(本文最后会对副作用做出详细的解释,各位小伙伴们耐心看哦!)         - 表达式语句的结果通常被丢弃,因为它们不会返回值给调用者。         - 表达式语句以分号' ; ' 结尾,表示语句的结束。

        (2)用法:

        表达式语句可以用于执行各种操作,包括但不限于:                 - 调用函数并传递参数。                 - 进行赋值操作。                 - 运算操作。                 - 递增或递减操作。                 - 调用带有副作用的操作,如printf函数打印输出。

        (3)示例:                   1)赋值操作: int x, y; x = 5; y = x * 2;                 2)函数调用: printf("Hello, World!\n");                 3)运算操作: int result; result = (2 + 3) * 4;                 4)递增或递减操作: int count = 0; count++;                 5)复合表达式: int a = 5, b = 3, c; c = (a + b) * (a - b);                 6)连续的函数调用: int sum = add(3, 5) + add(2, 4);

这里的add函数可以是任何返回值为int类型的函数。

                7)逻辑表达式: if (x > y) { printf("x is greater than y.\n"); }                 8)函数调用和赋值操作的组合: int result; result = computeValue(2, 3) + 5;

        注意事项:

        - 表达式语句可以单独作为一行代码,也可以与其他语句组合在一起形成更复杂的语句。         - 虽然表达式语句的结果通常被忽略,但仍然可以利用其副作用来实现一些操作,如函数调用中的打印输出等。

4、空语句

        说明:在C语言中,空语句是一种没有任何操作的语句,它只包含一个分号。空语句通常用于语法上需要语句但逻辑上不需要执行任何操作的情况。空语句在编程中有其特定的用途和场景。下面是关于C语言中空语句的详细信息:

(1)特点:

        - 空语句由一个分号组成,形式为 `;`。         - 空语句在执行时不做任何操作,它不会改变程序的状态或执行流程。         - 空语句通常用于需要一个语句但实际上不需要执行任何操作的情况下,如在某些条件下不执行任何代码,但语法上需要一个语句。

(2)用途:         1)占位符:

        当你编写代码时,可能会预留一些位置用于后续填充,这时可以使用空语句作为占位符。比如在编写循环时,可能会暂时不需要执行任何操作,但为了保持语法正确性,可以使用空语句。

while(condition) { // 暂时不需要执行任何操作 ; }         2)条件分支:

        在某些条件分支下,可能需要某个条件成立时不做任何操作。这时可以使用空语句。

if(condition) { // 条件成立时执行操作 } else { // 条件不成立时不执行任何操作 ; }         3)空循环:

        在需要无限循环的情况下,可以使用空语句。

while(1) { // 无限循环 // 可以在适当的时候使用break语句跳出循环 }         注意事项:

        - 空语句虽然在语法上是合法的,但过度使用会使代码变得难以理解和维护。因此,应谨慎使用空语句,确保清晰地表达代码的意图。         - 在某些编码规范或者团队规范中,可能会限制或者禁止使用空语句,因为它们通常会被认为是不良编程风格的一种体现。

5、复合语句

        说明:当谈到C语言中的复合语句时,我们通常指的是由一对花括号 `{}` 包围的一系列语句。这些语句在语法上被视为一个单独的语句块,也称为复合语句块或者代码块。

(1)语法: { statement_1; statement_2; // 更多语句 } (2)作用域:

        1)复合语句中声明的变量的作用域仅限于该语句块内。这意味着在该语句块外部无法访问这些变量。         2)在复合语句块中声明的变量称为局部变量。

(3)代码组织:

        1)复合语句通常用于组织一组相关的语句,使其作为一个整体执行。         2)它们也用于在控制语句(如条件语句和循环语句)中执行多个语句。

(4)初始化:

        可以在复合语句中初始化变量,例如:

{ int x = 5; int y = 10; // 更多语句 } (5)嵌套:

        复合语句可以嵌套在其他复合语句中,形成多层嵌套的代码块。

(6)控制语句中的使用:

        复合语句经常与控制语句一起使用,例如在条件语句 `if` 和循环语句 `for`、`while`、`do-while` 中。

示例:

#include int main() { int x = 10; { int y = 20; printf("x: %d\n", x); // 在复合语句块内可以访问外部变量 printf("y: %d\n", y); // 在同一复合语句块内访问局部变量 } // printf("y: %d\n", y); // 错误!y的作用域仅限于复合语句块内 return 0; }

(上面的示例简单来说就是小的可以用大的,大的不可用小的)

         注意事项:

     >> 虽然复合语句中的变量的作用域仅限于该语句块,但是不同的语句块中可以使用相同名称的变量,它们是独立的。

6、赋值语句

        说明:C语言中的赋值语句用于将一个值赋给一个变量。赋值语句的一般形式是将一个表达式的值赋给一个变量,并且表达式可以是一个常量、变量、函数调用或者是由运算符组成的复杂表达式。赋值语句是C语言中非常基础和常见的语法结构,是实现变量赋值和计算的关键。

(1)语法: variable = expression;

其中,`variable` 是要赋值的变量,而 `expression` 是计算出的值。

        代码示例:

int x = 5; // 声明一个整型变量x并初始化为5 int y; y = x + 3; // 将x+3的结果赋给变量y

(3)赋值操作符:

        `=`:简单赋值操作符,将右边表达式的值赋给左边的变量。

        复合赋值操作符:组合了赋值和算术运算符。

        `+=`:加法赋值,等价于 `a = a + b`。         `-=`:减法赋值,等价于 `a = a - b`。         `*=`:乘法赋值,等价于 `a = a * b`。         `/=`:除法赋值,等价于 `a = a / b`。         `%=`:取模赋值,等价于 `a = a % b`。

注意事项:

        1)赋值语句中等号左边必须是一个可修改的左值(lvalue),也就是一个变量或者一个数组元素。         2)赋值语句的右边可以是任何合法的C表达式,但赋值语句本身的值是赋值后左边变量的值。         3)赋值语句可以连续使用,例如 `x = y = 10;` 将会把10赋给y,然后把y的值赋给x。

        代码示例:

#include int main() { int a, b, c; a = 10; // 简单赋值 b = 5; c = a + b; // 表达式赋值 printf("a: %d, b: %d, c: %d\n", a, b, c); // 复合赋值操作符示例 a += 2; // a = a + 2; b *= 3; // b = b * 3; printf("a: %d, b: %d\n", a, b); return 0; }

三、总结 (1)控制语句:

        1)用于控制程序的执行流程,可以是条件语句(`if`、`switch`)、循环语句(`for`、`while`、`do-while`)和跳转语句(`goto`、`break`、`continue`、`return`)。

        2)通过条件判断或者循环来控制程序的执行顺序和重复执行的次数。

(2)函数调用语句:

        1)用于调用已经定义好的函数来执行特定的任务。         2)函数调用语句由函数名、参数列表和分号组成,如 `function_name(arguments);`。         3)调用函数时,参数列表中的参数会被传递给函数,函数执行后可能返回一个值。

(3)表达式语句:

        1)由一个表达式和分号组成的语句。         2)表达式语句通常用于执行一些操作,如函数调用、赋值操作等。         3)表达式语句的值通常被丢弃,而执行它的目的主要是为了产生副作用。

(4)空语句:

        1)由一个分号组成的语句,表示空操作。         2)空语句通常用于需要语法上需要一条语句但实际不需要执行任何操作的情况,如在某些条件下不执行任何操作。

(5)复合语句:

        1)由一对花括号 `{}` 包围的一系列语句组成的语句块。         2)复合语句可以包含多条语句,并且这些语句会被视为一个整体执行。         3)复合语句中可以声明局部变量,这些变量的作用域仅限于该语句块内。

(6)赋值语句:

        1)用于将一个值赋给一个变量。         2)赋值语句的一般形式是 `variable = expression;`,其中 `variable` 是要赋值的变量,而 `expression` 是计算出的值。         3)可能会涉及到类型转换,根据左右两边的类型进行自动类型转换,或者可以使用强制类型转换来明确指定类型。

四、补充知识 (1)声明部分和执行部分解释

        说明:在C语言中,程序可以被分为声明部分和执行部分。这两部分在程序执行过程中扮演不同的角色。

        1)声明部分(Declaration Section):

        变量声明:在此部分中,程序员声明了程序中将要使用的变量,包括其类型和名称。          函数原型声明:声明函数的名称、参数类型和返回类型,以便编译器在调用函数时检查参数的类型和数量。         结构声明:声明自定义的数据类型,包括结构体、联合体等。

        声明部分通常出现在程序的开头,并且在执行实际代码之前。它的作用是告诉编译器程序中将要使用的所有变量和函数的信息,以便于编译器在后续的代码中进行类型检查和优化。

                2)执行部分(Execution Section):

        赋值语句:对变量进行赋值操作。         函数调用:调用函数执行特定的任务。         控制语句:控制程序的执行流程,如条件语句(`if`、`switch`)、循环语句(`for`、`while`、`do-while`)等。         表达式语句:执行表达式并忽略结果,主要用于产生副作用。         其他语句:包括声明变量的语句、空语句等。

        执行部分是程序中实际执行逻辑的部分,它包含了程序的主要功能代码,根据声明部分中声明的变量和函数,执行相应的操作。

        3)声明部分和执行部分之间的关系:

        通常情况下,程序的执行顺序是从声明部分开始,逐步执行执行部分的代码,直到程序结束。声明部分提供了程序的基本结构和框架,执行部分则负责实现具体的功能和逻辑。

下面是一个简单的示例,展示了声明部分和执行部分的对比:

#include // 声明部分 int main() { // 执行部分开始 int x = 5; // 变量声明和赋值语句 int y = 10; int z; z = x + y; // 表达式语句 printf("The sum is: %d\n", z); // 函数调用语句 return 0; // 控制语句 } // 执行部分结束

在上面的示例中,`#include ` 是一个声明部分的例子,`int main() { ... }` 是程序的执行部分。

(2)计算机编程中副作用的解释

        说明:在计算机编程中,副作用(Side Effect)指的是表达式执行时对程序状态产生的可观察效果,而不仅仅是返回一个值。换句话说,副作用是指除了计算结果之外,对环境产生的任何影响。副作用是指表达式执行过程中对程序状态产生的可观察效果,不仅仅是计算结果的返回。理解和管理副作用是编写高质量代码的重要一环。

        1)修改变量或数据结构:

        最常见的副作用是修改变量的值或者修改数据结构的内容。例如,赋值语句 `x = 10;` 就会修改变量 `x` 的值。

        2) IO操作:

        输入/输出操作是典型的有副作用的操作,例如从键盘读取用户输入,或者向屏幕打印输出。这些操作改变了程序的环境状态。

        3)修改文件或外部资源:

        操作文件、数据库、网络等外部资源也会产生副作用。例如,向文件写入数据会改变文件的内容。

        4)函数调用:

        调用函数可能会产生副作用。例如,函数可以修改全局变量、调用其他具有副作用的函数、或者通过参数传递来修改调用者的状态。

        5)内存分配和释放:

        动态内存分配和释放也是有副作用的操作。分配内存会改变程序的内存状态,而释放内存则可能导致内存重用或者内存泄漏。

        6)并发和多线程:

        在并发编程中,副作用可能会引发各种竞态条件和并发问题,因为多个线程可以同时修改共享状态。

        7)副作用的重要性:

        副作用通常是必不可少的,因为程序必须与外部环境交互才能实现有用的功能。         然而,副作用也是代码可读性和可维护性的主要来源之一。当程序中存在过多的副作用时,代码往往会变得难以理解和调试。

        8)副作用的管理:

        在编程中,需要谨慎管理副作用,尽量减少副作用的数量和范围,以提高代码的可维护性和可测试性。         一些函数式编程语言通过限制副作用来提高程序的可靠性和可维护性。

五、问答环节

上期问题:  请预测以下代码的输出结果,并解释为什么会得到这个结果。

#include int main() { int x = 5; float y = 2.5; float result; result = x / y; printf("Result: %f\n", result); return 0; }

解释:

在预测代码的输出结果之前,我们先来看一下代码中的关键部分:

int x = 5; float y = 2.5; float result; result = x / y;

这里 `x` 是一个整数,`y` 是一个浮点数,它们分别是 `5` 和 `2.5`。接着,`result` 是一个浮点数变量,存储 `x / y` 的结果。

然而,`x / y` 是一个整数除法,因为 `x` 和 `y` 都是整数类型。在整数除法中,结果会被截断为整数部分,即 `5 / 2` 的结果是 `2`。然后,这个整数结果 `2` 被赋给 `result`,然后被隐式地转换为浮点数,并存储在 `result` 中。

因此,预测代码的输出结果为:

Result: 2.000000

输出结果为 `2.000000`,而不是 `2.500000`。这是因为整数除法导致了截断,所以结果被截断为 `2`。

提问:

编程题:输入两个正整数m和n,求其最大公约数和最小公倍数。

(请各位小伙伴们动动脑筋看看有什么简单的方法吧!作者大大将会在下一期的文章中做出解释!)

好了,以上就是本篇文章的主要内容了,希望各位小伙伴们能从本篇文章中学到有用的知识,顺便再给作者大大点点赞,点点关注和收藏吧!!!

下期预告:第六幕:C语言基础篇之数据的输入输出

(最近快过年了,在家天天大鱼大肉的,可能要胖个十几斤┭┮﹏┭┮)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3