C表达式_表达式类型
什么是表达式凡是能求出一个值的东西就是表达式。C 语言中表达式是最基本的值的生产单元。表达式可以简单到只有一个数字 5也可以复杂到嵌套多层函数调用和运算。核心规律不管哪种表达式最终都能求出一个值。 这就是表达式的本质。C 语言中的表达式类型1.字面量表达式直接写一个常量值它本身就是表达式。5 // 整数字面量表达式值是 5 3.14 // 浮点字面量表达式值是 3.14 a // 字符字面量表达式值是 97ASCII码 hello // 字符串字面量表达式值是字符串首地址使用场景 赋值、传参、参与运算。int x 5; // 5 是表达式值赋给 x printf(%d, 100); // 100 是表达式作为参数传递 int y 5 3.14; // 5 和 3.14 都是表达式2.标识符表达式变量名、函数名本身就是表达式。int x 10; x // 标识符表达式值是 10 int *ptr x; ptr // 标识符表达式值是 x 的地址使用场景 赋值右边、传参、参与运算。int a 5; int b a; // a 是标识符表达式值 5 赋给 b print_array(a); // a 是标识符表达式作为参数传递 int c a 3; // a 是标识符表达式参与算术运算3.算术表达式用算术运算符 - * / %连接操作数。a b // 值是 a 加 b a * 2 // 值是 a 乘以 2 a % 3 // 值是 a 除以 3 的余数 -a // 值是 a 的相反数使用场景 计算、赋值、传参。int sum a b; // 算术表达式的值赋给 sum printf(%d, a * 2); // 算术表达式的值作为参数 int result (a b) * (c - d); // 复杂算术表达式4.关系表达式用关系运算符 !比较两个值结果是 0假或 1真。a b // a 大于 b 则为 1否则为 0 a 5 // a 等于 5 则为 1否则为 0 a ! b // a 不等于 b 则为 1否则为 0使用场景 条件判断、循环条件、赋值。if (a b) { // 关系表达式作为 if 条件 // ... } while (i 10) { // 关系表达式作为循环条件 i; } int flag (a 5); // 关系表达式的值赋给变量5.逻辑表达式用逻辑运算符 || !组合条件结果是 0假或 1真。a 0 b 0 // a 和 b 都大于 0 则为 1 a 0 || b 0 // a 或 b 有一个大于 0 则为 1 !a // a 为 0 则为 1a 非 0 则为 0使用场景 复合条件判断。if (age 18 has_id) { // 两个条件同时满足 printf(可以进入); } if (score 90 || is_bonus) { // 满足任一条件 printf(优秀); } if (!is_error) { // 取反 printf(没有错误); }6.条件表达式三目运算符格式条件 ? 值1 : 值2。条件为真取值1为假取值2。a b ? a : b // 如果 a b值是 a否则值是 b使用场景 简洁地做二选一赋值int max (a b) ? a : b; // 取 a 和 b 中较大的 printf(%s, score 60 ? 及格 : 不及格); // 条件输出 int abs_val (x 0) ? x : -x; // 求绝对值7.赋值表达式用赋值运算符 - * /给变量赋值。赋值表达式本身也有值值就是赋给变量的那个数。x 10 // 表达式的值是 10 x 5 // 等价于 x x 5表达式的值是 x 的新值 x * 2 // 等价于 x x * 2表达式的值是 x 的新值使用场景 赋值、链式赋值、在条件中使用。int x 10; // 赋值表达式 int a, b, c; a b c 5; // 链式赋值c5 值为5b5 值为5a5 if ((x get_value()) 0) { // 赋值表达式的值参与比较 // x 被赋值同时判断是否大于 0 }8.逗号表达式用逗号 , 连接多个表达式从左到右依次执行整个表达式的值是最后一个表达式的值。a 1, b 2, c 3 // 依次执行整个表达式的值是 3使用场景 for 循环中初始化或更新多个变量。for (int i 0, j 10; i j; i, j--) { // i 和 j-- 组成逗号表达式 } int result (a 5, b 10, a b); // result 159.函数调用表达式函数调用表达式的格式是函数名(参数列表)。它的含义是调用一个函数并产生一个值——这个值就是函数的返回值。所以函数调用表达式本身是有值的它的值就是函数 return 回来的那个东西。printf(hello) // 值是 printf 的返回值打印的字符数 print_array(arr) // 值是 print_array(arr) 的返回值函数调用表达式既是一个动作调用函数也是一个值函数的返回值。 这就是为什么它可以出现在赋值、运算、条件判断等各种位置。print_array(arr) 函数调用表达式的详解print_array 是函数名arr 是参数实参整个 print_array(arr) 是一个函数调用表达式print_array 函数的值是什么取决于print_array函数的返回值❶print_array 函数调用表达式的值是空的没有值,返回类型是 voidvoid print_array(int arr[]) { // 没有 return 值 }❷print_array 函数调用表达式有返回值赋值给变量resultint print_array(int arr[]) { return 100; } int result print_array(arr); // print_array(arr) 这个函数调用表达式的值就是 100print_array(arr)函数调用表达式的不同使用场景场景一print_array(arr)作为独立语句函数调用表达式单独成一行不接收返回值。常见于 void 函数调用目的不是为了取值而是为了执行函数的副作用比如打印、修改数据。print_array(arr);场景二print_array(arr)赋值给变量print_array(arr)函数调用表达式的值返回值赋给一个变量。这是最常见的用法——调用函数拿到结果存起来。int result print_array(arr); // 返回值赋给变量result场景三print_array(arr)为另一个表达式的操作数print_array(arr) 是一个函数调用表达式它的值参与算术运算。print_array(arr)函数调用表达式的值可以像普通数值一样参与计算。int total print_array(arr) 10; // 返回值参与运算场景四print_array(arr)作为另一个函数参数嵌套调用print_array(arr) 是函数调用表达式它的返回值作为 printf 的参数传递。print_array函数调用表达式可以嵌套在另一个函数调用中。//print_array(arr) 返回值作为printf函数的参数 printf(%d, print_array(arr));场景五print_array(arr)用在条件判断中print_array(arr) 是函数调用表达式print_array(arr)的返回值通常是 0假 或 1真作为if判断条件判断的依据。if (is_valid(arr)) { ... }else{ ... }场景六print_array(arr)用在循环条件中print_array(arr)是函数调用表达式每次循环都会调用一次根据print_array(arr)返回值通常是 0假 或 1真决定是否继续循环。while (print_array(arr)) ) { // ... }10.sizeof 表达式格式sizeof(类型或表达式)。值是占用字节数类型是 size_t无符号整数。sizeof(int) // 值是 4通常 sizeof(arr) // 值是 205×4arr 不退化 sizeof(x) // 值是变量 x 占的字节数使用场景 动态内存分配、数组长度计算。int arr[5]; int len sizeof(arr) / sizeof(arr[0]); // 计算数组元素个数值为 5 int *p malloc(10 * sizeof(int)); // 分配 10 个 int 的空间11.指针相关表达式包括取地址 、解引用 *、指针运算。x // 取地址表达式值是 x 的内存地址 *ptr // 解引用表达式值是 ptr 指向的那个数据内容数值 ptr 1 // 指针算术表达式值是下一个元素的内存地址使用场景 动态内存操作、数组遍历、函数间传递地址int x 10; int *ptr x; // x 是取内存地址表达式 int val *ptr; // *ptr 是解引用表达式值为 *ptr数据内容值10 int arr[5] {1,2,3,4,5}; int *p arr 2; // arr 2指针算术表达式arr 2是内存地址 p 指向 arr[2] int v *(arr 3); // 解引用表达式值为 arr[3] 即 412.强制类型转换表达式格式(类型)表达式。值是将原值转换为目标类型后的结果值(int)3.14 // 值是 3 (float)x // 值是 x 转换为浮点数使用场景 类型不匹配时的显式转换。int x (int)3.14; // 浮点转整数值为 3 float ratio (float)a / b; // 避免整数除法截断