数据类型、运算符与表达式

对应教学日历:讲次 2(3月12日)


一、基本数据类型

类型关键字字节数(32位)取值范围格式符
整型int4-2,147,483,648 ~ 2,147,483,647%d
单精度浮点float4±3.4×10⁻³⁸ ~ ±3.4×10³⁸(6~7位有效数字)%f
双精度浮点double8±1.7×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸(15~16位有效数字)%lf
字符型char1-128 ~ 127 或 0 ~ 255%c

重点记忆int 4 字节、float 4 字节、double 8 字节、char 1 字节。

整型的修饰符

类型说明
short int(或 short短整型,通常 2 字节
long int(或 long长整型,通常 4 或 8 字节
unsigned int无符号整型,最高位参与数值
signed int有符号整型(默认)

字符型

  • char 存储的是 ASCII 码值(整数)
  • 字符常量用单引号'A', '0', '\n'
  • 大小写转换:'a' - 'A' = 32
  • 转义字符:\n(换行)、\t(制表)、\\(反斜杠)、\'(单引号)、\"(双引号)、\0(空字符)

二、常量与变量

常量

类型示例说明
整型常量100, -50, 0xFF(十六进制), 012(八进制)无小数点
浮点常量3.14, -2.5e3, .5有小数点或指数
字符常量'A', '\n', '\101'(八进制)单引号单个字符
字符串常量"Hello", ""双引号,以 \0 结尾
符号常量#define PI 3.14159宏定义,编译前替换

变量

变量定义类型 变量名 [= 初始值];

int a;              // 定义整型变量 a(未初始化,值为随机垃圾)
int b = 10;         // 定义并初始化
float x, y, z = 0;  // 同时定义多个,z 初始化为 0
char ch = 'A';      // 字符变量
  • 变量名遵循标识符命名规则(字母/下划线开头,不含特殊字符)
  • 先定义后使用——C语言要求所有变量在使用前必须声明
  • 未初始化的局部变量值不确定(内存中的垃圾值)

三、运算符与表达式

算术运算符

运算符含义示例结果
+加法5 + 38
-减法5 - 32
*乘法5 * 315
/整除(整数相除得整数)5 / 31
%取余(仅整数)5 % 32

重点:整数除法结果为整数(截断舍去小数)。5 / 3 = 1,不是 1.666。 若需小数结果,应使用 5.0 / 3(float)5 / 3

关系运算符(结果为 0 或 1)

> < >= <= == !=

易错:等于用 ==(双等号),不是 =(单等号是赋值)!

逻辑运算符

运算符含义说明
&&逻辑与(AND)两边都为真才为真
``
!逻辑非(NOT)取反

短路求值a && ba 为假,不再计算 ba || ba 为真,不再计算 b

赋值运算符

= += -= *= /= %=

a += 5;   // 等价于 a = a + 5;
b *= 2;   // 等价于 b = b * 2;

自增/自减运算符

运算符含义说明
++i前置自增先加后用:i 先加 1,再用 i 的值
i++后置自增先用后加:先用 i 的值,i 再加 1
--i前置自减先减后用
i--后置自减先用后减

重点:考试常考点!int a=3, b=++a;a=4, b=4int a=3, b=a++;a=4, b=3

条件运算符(三目)

表达式1 ? 表达式2 : 表达式3
// 若 表达式1 为真 → 结果 = 表达式2
// 若 表达式1 为假 → 结果 = 表达式3

逗号运算符

a = (b=3, b+5);  // b=3,然后 a=8

sizeof 运算符

sizeof(int)    // 4
sizeof(char)   // 1
sizeof(a)      // 变量 a 的字节数

运算符优先级(从高到低速记)

优先级运算符
1() [] -> .
2! ~ ++ -- +(正) -(负) *(取值) &(取地址) sizeof
3* / %
4+ -
5< <= > >=
6== !=
7&&
8`
9?:
10= += -=
11,

四、数据类型转换

自动类型转换(隐式)

  • 低精度 → 高精度:char → int → float → double
  • 表达式中的转换规则:将所有操作数统一转换为最高精度的类型再进行计算
  • 赋值转换:将等号右边的类型自动转为左边的类型
int a = 5;
double b = a;       // b = 5.0(int → double 自动)
int c = 3.14;       // c = 3(double → int,截断小数,不四舍五入!)

强制类型转换(显式)

(类型名)(表达式)
 
float x = 5.7;
int y = (int)x;      // y = 5(截断)
float z = (float)5 / 3;  // z = 1.666667

作业示例

ex3-1:基本四则运算

#include <stdio.h>
int main()
{
    int a,b;
    printf("请输入两个整数:");
    scanf("%d%d",&a,&b);
    printf("%d*%d=%d\n",a,b,a*b);
    printf("%d+%d=%d\n",a,b,a+b);
    printf("%d/%d=%d\n",a,b,a/b);    // 注意:整数除法!
    printf("%d-%d=%d\n",a,b,a-b);
    return 0;
}

要点

  • 整数除法得整数,a/b 结果是截断的整数
  • scanf 格式符与变量类型必须匹配(%d 对应 int
  • 没有除数为 0 的检查(这是不严谨的,实际编程需要判断)

ex3-2:宏定义与浮点运算

#include "stdio.h"
#define PI 3.14159
 
int main()
{
    float radius, length, area, volume;
    scanf("%f%f",&radius,&length);
    area = PI * radius * radius;
    volume = area * length;
    printf("%.6f",volume);           // 保留 6 位小数
    return 0;
}

要点

  • #define PI 3.14159 宏定义,使用时直接文本替换
  • %f 用于 float 的输入输出
  • %.6f 控制小数位数

ex3-3-1, ex3-3-2:宏定义与格式输出

#include "stdio.h"
#define DIR "C:\\ABC.TXT"
int main()
{
    printf("%s",DIR);   // 输出字符串宏
    return 0;
}
#include "stdio.h"
int main()
{
    int a=1234;
    float b=1.23456;
    char ch='z';
    printf("a =%8d\n",a);      // 宽度8,右对齐
    printf("b =%8.2f\n",b);    // 宽度8,2位小数
    printf("ch=%8c\n",ch);     // 宽度8
    return 0;
}

要点

  • %8d → 宽度 8,右对齐(默认)
  • %8.2f → 总宽度 8,2 位小数
  • %s 输出字符串

ex3-4:进制转换输出

#include <stdio.h>
int main()
{
    int a;
    scanf("%d",&a);
    printf("The decimal system: %d\n",a);     // 十进制
    printf("The octal system: %o\n",a);       // 八进制
    printf("The hexdecimal system: %x\n",a);  // 十六进制
    return 0;
}

要点

  • %d 十进制、%o 八进制、%x 十六进制
  • 仅控制输出显示,变量内部的二进制值不变

ex4-3:使用 math.h 数学函数

#include<stdio.h>
#include<math.h>
#define PI 3.14159265
 
int main()
{
    int a;
    double result;
    scanf("%d",&a);
    result=(cos(50*PI/180.0)+sqrt(37.5))/(a+1);
    printf("%.2f\n",result);
    return 0;
}

要点

  • #include<math.h> 数学库头文件
  • cos() 参数是弧度(不是角度),角度转弧度:角度 × π / 180
  • sqrt() 平方根函数
  • 编译时需要链接数学库:gcc -o prog prog.c -lm

作业重点

  • 数据类型及取值范围:int(4字节)、float(4字节)、double(8字节)、char(1字节)
  • 整数除法:5/3 = 1,不是 1.666;取余 % 只能用于整数
  • ++i(前置)和 i++(后置)的区别
  • 逻辑运算符的短路求值
  • ==(等于)和 =(赋值)必须区分
  • 强制类型转换:(类型名)表达式,小数转整数截断不四舍五入
  • 宏定义 #define 只是文本替换,不加分号