第 2 讲:让计算机学会运算

一、变量与常量

(一)变量

  1. 定义:存储数值可改变的量,需指定数据类型,占用固定内存空间(如int型占4字节)。
    • 一般形式:数据类型 变量名称1, 变量名称2, ..., 变量名称n;
    • 示例:int count;(定义存储常服数量的整型变量count)
  2. 初始化:定义时为变量赋予初始值,避免使用未初始化变量(会导致运行错误)。
    • 一般形式:数据类型 变量名称 = 初始值;
    • 示例:
      • float cj = 90;(定义浮点型变量cj,初始值90.0)
      • int x = 1, y, z;(x初始值1,y、z未初始化,值为随机数)

(二)常量

  1. 分类及定义
    类型 说明 示例 注意事项
    整型常量 整数,默认int型存储 sum = sum + 357 可指定类型/进制:<br>- 92LL(long long型)、92U(无符号整型)<br>- 07(八进制)、0X1F(十六进制)
    浮点型常量 小数或指数形式,默认double型 十进制小数:0.123123.0<br>指数形式:1.2e-27E0 可指定类型:<br>- 3.14F(float型)、3.14L(long double型)<br>- 十进制小数必须含小数点,指数形式e前后需有数
    字符常量 单撇号括起的1个字符,值为ASCII码 普通字符:'a'(97)、'0'(48)<br>转义字符:'\n'(换行,10)、'\x62'(‘b’) 不可用'ab'表示2个字符,需分开写'a''b'
    字符串常量 双撇号括起的字符序列,末尾自动加'\0'作为结束标志 "China"(内存存储:C h i n a \0)、"中国" 与字符常量区别:'a'占1字节,"a"占2字节(含'\0'
    符号常量 用标识符表示常量,需用#define定义 #define PI 3.14(PI代表3.14) 定义后不可修改,通常大写,增强代码可读性

二、指针变量

(一)核心概念

指针变量存储的是其他变量的内存地址,通过地址可间接访问目标变量,类比“通过房间号找房间内物品”。

(二)定义与初始化

  1. 定义:需指定基类型(与目标变量类型一致),*表示指针类型。
    • 一般形式:数据类型 *变量名称;
    • 示例:
      • float *p3;(定义指向float型变量的指针p3)
      • double *p4, *p5;(定义2个指向double型变量的指针)
      • 注意:double *p1, p2;中p2是普通double变量,非指针
  2. 初始化:初始值为已定义变量的地址(&取地址运算符)或空指针(0)。
    • 一般形式:数据类型 *变量名称 = 初始值;
    • 示例:
      • char a, *p1 = &a;(p1存储变量a的地址,指向a)
      • int *p2 = 0;(p2为空指针,不指向任何变量)

(三)变量访问方式

访问方式 说明 示例
直接访问 通过变量名访问 short cj = 92;(直接给cj赋值92)
间接访问 通过指针变量访问(*指针运算符,表“指向的变量”) *p1 = 90;(通过p1修改其指向的变量a的值为90)

三、运算符和表达式

(一)运算符分类及规则

  1. 核心运算符汇总

    类别 运算符 含义 优先级 结合性 示例 结果
    算术运算符 +(单目) 正号 右结合 +5 5
    -(单目) 负号 右结合 -5 -5
    ++ 自增 右结合 i=5; ++i 6
    -- 自减 右结合 i=5; --i 4
    * 乘法 左结合 5*3 15
    / 除法 左结合 5/3(整型)、5/3.0(浮点型) 1、1.666…
    % 取余 左结合 5%3 2
    +(双目) 加法 中低 左结合 5+3 8
    -(双目) 减法 中低 左结合 5-3 2
    关系运算符 <<=>>= 比较大小 左结合 5>2 1(真)
    == 等于 左结合 5==2 0(假)
    != 不等于 左结合 5!=2 1(真)
    逻辑运算符 ! 逻辑非 右结合 !0 1(真)
    && 逻辑与 左结合 1&&0 0(假)
    ` ` 逻辑或 左结合
    赋值运算符 = 赋值 最低 右结合 a = 5 将5赋给a
  2. 表达式计算规则

    • 先按优先级执行(如先乘除后加减,先逻辑非后逻辑与/或);
    • 优先级相同时,按结合性执行(如算术运算符左结合,单目运算符右结合);
    • 不可省略乘号(如a*b不可写ab),可加小括号强制改变顺序(如(a+b)*c)。

(二)特殊情形

  1. 短路运算:逻辑表达式确定最终值后,后续分量不再计算。
    • 示例:a=0, b=10时,c=(a>=1 && (b=5))中,a>=1为假,直接确定结果为假,b=5不执行,最终b=10
  2. 数据类型转换
    • 自动转换:赋值时低精度→高精度(如char→short→int→long long),可能丢失数据(如char a=127; a=a+1;后a=-128,溢出);
    • 强制转换:用(目标类型)强制转换,优先级最高。
    • 示例:(char)12.5(将12.5转为char型12)、(int)x + y(先转x为int型,再与y相加)。

四、处理简单问题(程序编写)

(一)基本步骤

  1. 编写main()函数(程序入口);
  2. 定义与初始化变量;
  3. 输入数据(如scanf);
  4. 编写算法语句(核心逻辑);
  5. 输出结果(如printf)。

(二)示例

  1. 华氏温度转摄氏温度
    • 公式:c = 5.0/9 * (f - 32)(用5.0避免整型除法);
    • 代码:
    #include <stdio.h>
    int main() {
        float c, f = 64;  // 初始化华氏温度f=64
        c = 5.0/9 * (f - 32);  // 计算摄氏温度
        printf("摄氏温度: %.1f\n", c);  // 输出结果(如17.8)
        return 0;
    }
    
  2. 三角形面积计算(海伦公式)
    • 公式:p=(a+b+c)/2s=sqrt(p*(p-a)*(p-b)*(p-c))(需包含math.h);
    • 代码:
    #include <stdio.h>
    #include <math.h>  // 调用sqrt函数需包含
    int main() {
        float a=6, b=7, c=8, p, s;  // 初始化三边长
        p = (a + b + c) / 2;  // 计算半周长
        s = sqrt(p * (p - a) * (p - b) * (p - c));  // 计算面积
        printf("三角形面积: %.2f\n", s);  // 输出结果(如20.33)
        return 0;
    }
    
  3. 大写字母转小写字母
    • 原理:小写字母ASCII码 = 大写字母ASCII码 + 32;
    • 代码:
    #include <stdio.h>
    int main() {
        char u_l = 'B';  // 定义大写字母变量
        u_l = u_l + 32;  // 转为小写('B'+32='b')
        printf("小写字母: %c\n", u_l);  // 输出'b'
        return 0;
    }
    

五、重点与难点

  1. 重点
    • 变量的定义、初始化与使用;
    • 常量(尤其是符号常量、转义字符)的定义与使用;
    • 算术、关系、逻辑运算符的优先级与表达式计算。
  2. 难点
    • 指针变量的定义、初始化及间接访问;
    • 数据类型自动转换的溢出问题与强制转换的正确使用。

六、思考题

  1. 符号常量与其他常量(整型、浮点型等)的区别:符号常量用标识符表示,无类型;其他常量有明确类型。符号常量与变量的区别:符号常量定义后不可修改,变量值可改变。
  2. 程序运行结果错误的排查方法:检查变量是否初始化、数据类型是否匹配、运算符优先级是否正确、公式逻辑是否有误、是否存在数据溢出等。