初识C语言 | 第4篇
📅 2026/7/6 14:33:50
👁️ 阅读次数
📝 编程学习
文章目录
- 内置数据类型
- 操作数
- 核心释义
- 分类举例
- 操作符
- 算数操作符
- 位操作符
- 赋值操作符
- 单目操作符
- 关系操作符
- 逻辑操作符
- 条件操作符
- 逗号表达式
- 下标引用、函数调用和结构成员操作符
- 常用关键字
- 数据类型相关
- 流程控制相关
- 存储类型与作用域相关
- 其他
- 变量命名
内置数据类型
- 本质:数据类型就是给计算机下达的“圈地指令”。它规定了变量在内存中占据的空间大小(字节数)以及数据的存储格式(如何解读二进制)。
- 作用:决定了数据能存多大范围、精度如何,是程序运行的基石。
- 常用
- char (字符/小整数,1字节)
- short (短整型,2字节)
- int (基本整型,4字节,32/64位系统通用)
- long (长整型,4字节Windows32/64位)
- long long (长长整型,8字节)
- float (单精度浮点,通常4字节)
- double (双精度浮点,通常8字节)
- long double (扩展精度浮点,8字节)
操作数
核心释义
- 参与运算的数据/变量/常量,就是运算符用来“加工处理”的原材料。
- 运算符是动作,操作数是动作作用的对象。
分类举例
- 单目运算符:1个操作数
!flag → 运算符 ! ,操作数: flag
&a → 运算符 & ,操作数: a
- 双目运算符:左右2个操作数
a + 5 → 运算符 + ,左操作数 a ,右操作数 5
x > y → 运算符 > ,操作数: x 、 y
- 三目运算符:3个操作数
cond ? exp1 : exp2 → 三个操作数依次为 cond 、 exp1 、 exp2
一句话速记
运算符=干活的工具;操作数=工具要摆弄的料子。
操作符
算数操作符
- 加法
int main()
{
int sum = 3 + 5;
printf(“%d\n”,sum);
return 0;
} - 减法
int main()
{
int sum = 10 - 7;;
printf(“%d\n”,sum);
return 0;
} - 乘法
int main()
{
int sum = 3 * 5;
printf(“%d\n”,sum);
return 0;
} - 除法
int main()
{
int m = 15 / 5;
printf(“%d\n”,m);
return 0;
} - 取摸(取余)
int main()
{
int n = 5 % 3;
printf(“%d\n”,n);
return 0;
} - 幂运算(求次方)
int main()
{
int s = 2 ** 3;
printf(“%d\n”,s);
return 0;
} - 整除(向下取整除法)
int main()
{
int u = 9 // 5;
printf(“%d\n”,u);
return 0;
}
位操作符
位操作符是对整数的二进制位逐位进行运算的操作符。
- &:按位与
- 示例:5 & 3 - > 1;//两位都为1才为1
- 分析:5的二进制是101,3的二进制是011,按位与结果是001,对应十进制1
- |:按位或
- 示例:5 | 3 - > 7;//有一位为1就为1
- 分析:5的二进制是101,3的二进制是011,按位或结果是111,对应十进制7
- ^:按位异或
- 示例:5 ^ 3 - > 6;//两位不同为1,相同为0
- 分析:5的二进制是101,3的二进制是011,按位与结果是110,对应十进制6
- ~:按位取反
- 示例:~5 - > -6;//0变1,1变0,得补码
- 分析:-5的二进制是101,对应的32进制数前面全是0;按位取反是010,对应32位二进制前面全是1,即得补码。补码最高位是1,为负数。对补码取反后加1,再转化为十进制数是6。即绝对值为6,最终结果为-6.(正数按位取反 ,其结果就是取相反数再减一;负数按位取反,结果是取绝对值减一)
- <<:左移
- 示例:5 << 1 - > 10;//各位左移,右侧补零
- 分析:5的二进制是101,左移后为1010,对应十进制数是10
:右移
- 示例:5 >> 1 - > 2;//各位右移,左侧补符号位
- 分析:5的二进制是101,右移后为10,对应十进制数是2
:无符号右移
- 示例:-1 >> 1 - > 2147483647,;//各位右移,左侧始终补0
- 分析:计算机实际存储负数用的是补码,-1的补码是32个1。右移左侧补零,其余位位全1,对应十进制数为2147483647。
赋值操作符
- 各操作符功能详解
- = :基本赋值操作符,将右边的值直接赋给左边变量。例如: int a = 10;
- += :加法赋值,等价于 a = a + b 。例如: a += 5; 表示 a 增加 5。
- -= :减法赋值,等价于 a = a - b 。例如: a -= 3; 表示 a 减少 3。
- *= :乘法赋值,等价于 a = a * b 。例如: a *= 2; 表示 a 乘以 2。
- /= :除法赋值,等价于 a = a / b 。例如: a /= 4; 表示 a 除以 4。
- &= :按位与赋值,等价于 a = a & b 。用于对二进制位进行“与”运算后赋值。
- ^= :按位异或赋值,等价于 a = a ^ b 。用于对二进制位进行“异或”运算后赋值。
- |= :按位或赋值,等价于 a = a | b 。用于对二进制位进行“或”运算后赋值。
- ‘>>=’:右移赋值,等价于 a = a >> b 。将 a 的二进制位向右移动 b 位后赋值。
- <<= :左移赋值,等价于 a = a << b 。将 a 的二进制位向左移动 b 位后赋值。
- 使用注意事项
- 复合赋值操作符具有隐式类型转换特性,例如 short s = 1; s += 1; 是合法的。但short s = 1; s = s + 1; 可能因类型提升而报错。’s = s + 1; ‘前面需要类型说明。
- 赋值操作符的优先级较低,表达式会先计算右边,再执行赋值。
- 位运算赋值操作符(如 &= , ^= , |= )常用于底层数据处理、标志位设置等场景。
单目操作符
只需要一个操作数就能完成运算的操作符。
- ! :逻辑反操作,用于将布尔值取反。例如: if (!a) 表示当 a 为假(0)时条件成立。
- 布尔值:只有两个固定取值的逻辑值
- :负值操作符,用于取相反数。例如: int b = -a;
- :正值操作符,通常用于显式表明正数,实际作用不大,但可用于强制类型提升。
- & :取地址操作符,用于获取变量的内存地址。例如: int *p = &a;
- sizeof :计算操作数所占内存字节数,是编译期常量。例如: sizeof(int) 返回 4(在32位系统上)。
- ~ :按位取反操作符,对二进制每一位取反。例如: ~5 (即 ~0101 )结果为 -6 (补码表示)。- – :自减操作符,分为前置 --a 和后置 a-- ,前者先减后用,后者先用后减。
- ++ :自增操作符,同样分前置 ++a 和后置 a++ ,语义与 – 类似。
- :解引用操作符,用于访问指针所指向的内存内容。例如: int val = *p;
- (类型) :强制类型转换操作符,用于显式转换数据类型。例如: (int)3.14 结果为 3。
关系操作符
:大于
= :大于等于
- < :小于
- <= :小于等于
- != :不等于
- == :等于
逻辑操作符
&& (逻辑与):只有当左右两个条件都为真时,整个表达式才为真。例如: if (a >= 10 && b == 0) 表示“只有a大于等于10,且b为0”才允许执行if下的代码。
- int main()
{
int a = 15;
int b = 0;
if (a >= 10 && b == 0)
printf(“真\n”);
else
printf(“假\n”);
return 0;
}- int main()
|| (逻辑或):只要左右两个条件中有一个为真,整个表达式就为真。例如: if (a >= 20 || b == 0) 表示“分a大于等于20或b等于0”即可执行if下的代码。
- int main()
{
int a = 25;
int b = 5;
if (a >= 20 || b == 0)
printf(“真\n”);
else
printf(“假\n”);
return 0;
}
- int main()
条件操作符
条件操作符,也常被称为“三目运算符”
- 其语法结构: exp1 ? exp2 : exp3
- 作用:用于简化条件判断的简洁写法,功能等价于一个 if-else 语句,但更紧凑、适合在表达式中直接使用。
- 执行逻辑非常直观:
- 首先计算 exp1 (条件表达式)的值;
- 如果 exp1 为真(非零),则整个表达式的结果是 exp2 的值;
- 如果 exp1 为假(零),则整个表达式的结果是 exp3 的值。
- 代码示例:
int main()
{
int a = 10;
int b = 15;
int max = (a > b) ? a : b;
printf(“%d\n”, max);
return 0;
}
逗号表达式
- 语法形式: exp1, exp2, exp3, …, expN
- 执行规则:从左到右依次计算每个表达式,整个逗号表达式的值是最后一个表达式 expN 的值。
- 典型用途:常用于 for 循环的初始化或更新部分,或在需要多个表达式但只允许一个表达式的地方(如宏定义、函数参数)。
- 示例:
- int a = (1 + 2, 3 + 4); // a 的值是 7,因为逗号表达式取最后一个值
- for (int i = 0, j = 10; i < j; i++, j–) { … }
下标引用、函数调用和结构成员操作符
- [] — 下标引用操作符
- 用于访问数组元素或指针所指向的内存位置。
- 示例: arr[3] 表示访问数组 arr 的第4个元素(索引从0开始)。
- () — 函数调用操作符
- 用于调用函数,括号内可传入参数。
- 示例: printf(“Hello”) 、 add(2, 3)
- . — 结构体成员访问操作符(点操作符)
- 用于访问结构体变量的成员。
- 示例:
struct Student s;
s.age = 20; // 使用 . 访问结构体成员
- -> — 指针访问结构体成员操作符(箭头操作符)
- 用于通过结构体指针访问其成员。
- 示例:
struct Student *p = &s;
p->age = 20; // 等价于 (*p).age = 20
常用关键字
数据类型相关
用于定义变量或数据的类型。
- 基本类型: char , int , float , double , void (无)
- 修饰符(用于改变类型的长度或符号): short , long , signed(有符号的) , unsigned (无符号的)
- 自定义类型构造: struct (结构体), union (共用体), enum (枚举)
- 类型重命名: typedef
流程控制相关
用于控制代码的执行顺序。
- 条件判断: if , else , switch , case , default
- 循环结构: for , do , while
- 跳转语句: break , continue , goto , return
存储类型与作用域相关
用于定义变量的生命周期、可见性或存储位置。
- 存储类说明符: auto (自动变量,默认), static (静态), extern (外部声明), register (寄存器)
- 类型限定符: const (常量/只读), volatile (易变/防止优化)
其他
运算符: sizeof (计算大小)
变量命名
变量命名应“见名知义”(语义化)
- 变量名应当清晰地表达其代表的含义,避免使用无意义的字符。
- 例如,使用 int age 来存储年龄,能够让人一眼看出该变量的用途;
- 而如果使用 int a 或 int aaa 来命名,虽然语法合法,但无法体现变量的实际意义,会极大降低代码的可读性。
变量命名需遵守硬性语法规则
- 变量名只能由字母(a-z, A-Z)、数字(0-9)和下划线(_)组成,且绝对不能以数字开头。
- 此外,C语言严格区分大小写, Age 和 age 会被视为两个不同的变量。
变量命名不能是关键字
- 变量名严禁使用C语言的32个标准关键字(如 int , float , if , else , return 等)。
- 这些关键字已被系统赋予了特定的语法含义,如果用作变量名,会导致编译器报错。
编程学习
技术分享
实战经验