第2章 类型、运算符与表达式

1. 变量与数据类型

(1) 基本数据类型

类型 存储大小 (典型) 表示范围 示例
char 1字节 -128~127 或 0~255 char c = 'A';
int 4字节 -2,147,483,648~2,147,483,647 int i = 42;
float 4字节 ±3.4e-38~±3.4e38 float f = 3.14;
double 8字节 ±1.7e-308~±1.7e308 double d = 3.14;
void - 无类型 void func();

(2) 类型修饰符

  • 扩展范围
    • short:短整型(通常2字节)
    • long:长整型(4或8字节)
    • long long:扩展长整型(C99,至少8字节)
  • 符号性
    • signed:有符号(默认)
    • unsigned:无符号(仅非负值)

示例

unsigned short us = 65535;  // 0~65535
long double ld = 3.1415926535;

2. 常量(Literals)

(1) 整型常量

  • 十进制:123
  • 八进制:0173(前缀0
  • 十六进制:0x7B(前缀0x
  • 后缀:Llong)、Uunsigned
    long big = 123456789L;
    unsigned int mask = 0xFFFFU;
    

(2) 浮点常量

  • 标准形式:3.14
  • 科学计数法:1.23e-5
  • 后缀:Ffloat)、Llong double
    double d = 1e10;
    float f = 2.0F;
    

(3) 字符与字符串常量

  • 字符:'A''\n'(转义字符)
  • 字符串:"hello"(以'\0'结尾)
    char newline = '\n';
    char* str = "Hello, C!";
    

3. 运算符(Operators)

(1) 算术运算符

运算符 作用 示例
+ 加法 a + b
- 减法/取负 -x
* 乘法 3 * 5
/ 除法 7 / 23
% 取模(余数) 7 % 21

(2) 关系与逻辑运算符

运算符 作用 示例
== 相等 if (x == 0)
!= 不等 while (c != EOF)
&& 逻辑与 if (x>0 && y>0)
` `
! 逻辑非 if (!valid)

(3) 位运算符

运算符 作用 示例
& 按位与 flags & MASK
` ` 按位或
^ 按位异或 a ^ b(相同为0)
~ 按位取反 ~0xFF0xFFFFFF00
<< 左移(乘2^n) x << 2
>> 右移(除2^n) x >> 1

(4) 赋值与复合运算符

x += y;    // 等价于 x = x + y
x &= mask; // 等价于 x = x & mask

4. 类型转换(Type Conversions)

(1) 隐式转换(自动)

  • 规则:小类型→大类型(避免精度损失)
    int i = 10;
    float f = i;  // int → float
    
  • 算术运算中的转换
    • char/shortint(整型提升)
    • int + floatfloat

(2) 显式转换(强制)

double d = 3.14;
int i = (int)d;  // 截断小数部分(i=3)

5. 表达式与语句

(1) 表达式求值顺序

  • 优先级* / % > + - > << >> > & > | > && > ||
  • 结合性:大多数从左到右(赋值符从右到左)
    x = y = 0;  // 从右到左赋值
    

(2) 副作用与序列点

  • 副作用:表达式对变量的修改(如i++)。
  • 序列点:保证副作用完成的点(如;&&||)。
    int i = 0;
    printf("%d %d", i++, i++); // 未定义行为!
    

6. 关键编程技巧

(1) 统计二进制中1的个数

int bitcount(unsigned x) {
    int b;
    for (b = 0; x != 0; x &= (x - 1))
        b++;
    return b;
}

原理x &= (x - 1) 清除最右侧的1

(2) 循环移位

unsigned rightrot(unsigned x, int n) {
    int bits = sizeof(x) * 8;
    n %= bits;
    return (x >> n) | (x << (bits - n));
}

示例rightrot(0x12345678, 4)0x81234567


7. 总结表格

主题 核心内容
数据类型 charintfloatdouble及修饰符(shortlongunsigned
常量表示 整型(0x0前缀)、浮点(e表示法)、字符(转义序列)
运算符 算术、关系、逻辑、位运算的优先级与结合性
类型转换 隐式(自动提升)与显式(强制)转换
高效位操作 位掩码、移位、统计1的个数

8. 为什么重要?

  • 底层控制:直接操作硬件(如寄存器、位字段)。
  • 性能优化:位运算比算术运算更快。
  • 理解C本质:类型系统和运算符是C语言的核心设计哲学。

:本章是后续学习指针、数组、结构体的基础,需深入理解!

posted @ 2025-05-05 18:58  MachineGaming  阅读(24)  评论(0)    收藏  举报