运算符及表达式
运算符及表达式
在C语言中,运算符是用于执行特定操作的符号,而表达式则是由运算符和操作数组成的式子。
1) 运算符
运算符的目数
- 单目运算符:只需要一个操作数,如
!
(逻辑非)、++
(自增)、--
(自减)、&
(取地址)等。 - 双目运算符:需要两个操作数,如
+
(加法)、-
(减法)、*
(乘法)、/
(除法)、%
(取余)等。 - 三目运算符(条件运算符):需要三个操作数,如
? :
。
运算符的优先级与结合性
运算符的优先级决定了表达式中运算的顺序,而结合性则决定了当多个相同优先级的运算符出现时,如何确定运算顺序。例如,乘法(*
)和除法(/
)的优先级高于加法和减法,而乘法和除法从左到右结合。
赋值运算符与赋值表达式
- 赋值运算符:
=
,用于将右侧的值赋给左侧的变量。 - 赋值表达式:如
a = b + c;
,这是一个赋值表达式,其值就是赋值操作的结果(即b + c
的值)。
算术运算符及算术表达式
- 算术运算符:
+
、-
、*
、/
、%
。 - 算术表达式:由算术运算符和操作数组成的表达式,如
a + b * c
。
自增(++)、自减(–)运算符及表达式
- 自增运算符:
++
,用于将变量的值加1。 - 自减运算符:
--
,用于将变量的值减1。 - 前置与后置:
++a
(先加后使用)和a++
(先使用后加)的区别。
关系运算符及关系表达式
- 关系运算符:
>
、>=
、<
、<=
、==
、!=
。 - 关系表达式:用于比较两个操作数的大小或是否相等,结果是一个布尔值(真或假)。
逻辑运算符及逻辑表达式
- 逻辑运算符:
!
(逻辑非)、&&
(逻辑与)、||
(逻辑或)。 - 逻辑表达式:用于组合多个关系表达式,并返回一个布尔值。
逗号运算符与逗号表达式
- 逗号运算符:
,
,用于将多个表达式组合成一个表达式。 - 逗号表达式的操作数求值顺序:从左到右依次求值,整个逗号表达式的值是最后一个操作数的值。
2) C语言中合法的表达式,表达式的求值
- 合法的表达式:符合C语言语法规则的表达式都是合法的。
- 表达式的求值:根据运算符的优先级和结合性,以及操作数的值,计算表达式的值。
3) 表达式的数据类型,及表达式运算中操作数类型的自动转换与强制类型转换
- 表达式的数据类型:取决于运算符和操作数的类型。例如,
a + b
的类型通常是a
和b
类型的公共类型(或更宽的类型)。 - 自动类型转换(也称为隐式类型转换):当操作数的类型不同时,编译器会尝试将它们转换为公共类型。例如,在
int a = 3.5;
中,3.5
会被自动转换为int
类型。 - 强制类型转换(也称为显式类型转换):使用类型转换运算符
()
来强制将一个类型的值转换为另一个类型。例如,(float)a
将a
的值转换为float
类型。在进行强制类型转换时,可能会丢失精度或发生其他不可预见的行为,因此应谨慎使用。
基本语句和函数使用的详细讲解
1. 顺序结构语句
- 表达式语句:最简单的语句,用于执行赋值、函数调用等操作。
- 空语句:仅包含一个分号的语句,不执行任何操作。
- 复合语句:用花括号括起来的一组语句,可以视为一个单独的语句块。
代码案例:
#include <stdio.h>int main() {int a = 5; // 表达式语句printf("%d\n", a); // 表达式语句(函数调用); // 空语句{ // 复合语句开始int b = 10;printf("b = %d\n", b);} // 复合语句结束return 0;
}
2. 选择结构语句
- if 语句:如果条件为真,则执行一段代码。
- if…else 语句:如果条件为真,执行一段代码,否则执行另一段代码。
- if…else…if 语句:多个条件判断,根据满足的条件执行相应的代码块。
- switch 语句:根据表达式的值,选择执行多个代码块中的一个。
代码案例:
#include <stdio.h>int main() {int number = 2;if (number == 1) {printf("Number is 1\n");} else if (number == 2) {printf("Number is 2\n");} else {printf("Number is not 1 or 2\n");}int day = 3;switch (day) {case 1:printf("Monday\n");break;case 2:printf("Tuesday\n");break;case 3:printf("Wednesday\n");break;default:printf("Other day\n");}return 0;
}
3. if嵌套
if语句内部可以嵌套另一个if语句,用于处理更复杂的条件逻辑。
代码案例:
#include <stdio.h>int main() {int a = 5;int b = 10;if (a > 2) {if (b > 8) {printf("Both conditions are true\n");} else {printf("Only first condition is true\n");}} else {printf("None of the conditions are true\n");}return 0;
}
4. 循环结构语句
- while 循环:当条件为真时,重复执行一段代码。
- do…while 循环:至少执行一次代码块,然后检查条件,如果条件为真,则重复执行。
- for 循环:一种更紧凑的循环结构,通常用于已知循环次数的情况。
代码案例:
#include <stdio.h>int main() {int i = 0;// while 循环while (i < 5) {printf("%d ", i);i++;}printf("\n");i = 0;// do...while 循环do {printf("%d ", i);i++;} while (i < 5);printf("\n");// for 循环for (int j = 0; j < 5; j++) {printf("%d ", j);}printf("\n");return 0;
}
5. 循环嵌套(二重循环)
一个循环内部包含另一个循环,通常用于处理二维数组或进行复杂的迭代。
代码案例:
#include <stdio.h>int main() {for (int i = 0; i < 3; i++) { // 外层循环for (int j = 0; j < 3; j++) { // 内层循环printf("(%d, %d) ", i, j);}printf("\n");}return 0;
}
6. 辅助控制语句
continue 语句
continue
语句用于跳过当前循环的剩余部分,直接进入下一次循环。它不会终止循环,而是重新开始下一次迭代。
break 语句
break
语句用于立即终止循环或switch语句。在循环中,break
语句会跳过当前循环的剩余部分,并继续执行循环之后的代码。
代码案例
#include <stdio.h>int main() {int i;// 使用continue语句跳过偶数for (i = 0; i < 10; i++) {if (i % 2 == 0) {continue;}printf("%d ", i);}printf("\n");// 使用break语句在找到5时终止循环for (i = 0; i < 10; i++) {if (i == 5) {break;}printf("%d ", i);}printf("\n");return 0;
}
7. 标准函数的使用
数学函数:math.h
fabs()
:计算浮点数的绝对值。pow()
:计算一个数的幂。sqrt()
:计算一个非负数的平方根。
输入输出函数:stdio.h
printf()
:格式化输出函数。scanf()
:格式化输入函数。
字符串函数:string.h
strlen()
:计算字符串的长度(不包括终止字符’\0’)。strcmp()
:比较两个字符串。strcpy()
:复制一个字符串到另一个字符串。strcat()
:连接两个字符串。
代码案例
#include <stdio.h>
#include <math.h>
#include <string.h>int main() {// 数学函数使用double num = -5.5;double abs_num = fabs(num);double power = pow(2, 3);double sqrt_num = sqrt(9);printf("fabs(%f) = %f\n", num, abs_num);printf("pow(2, 3) = %f\n", power);printf("sqrt(9) = %f\n", sqrt_num);// 字符串函数使用char str1[50] = "Hello, ";char str2[] = "World!";char str3[100];strcpy(str3, str1);strcat(str3, str2);printf("Concatenated string: %s\n", str3);printf("Length of str2: %zu\n", strlen(str2));// 输入输出函数使用int a;printf("Enter an integer: ");scanf("%d", &a);printf("You entered: %d\n", a);return 0;
}
在使用
strlen()
函数时,返回的类型是size_t
(在C语言中是一个无符号整数类型),因此在printf
中使用
%zu
格式化说明符来输出它。这是C99标准引入的,如果你的编译器不支持C99或更高版本,你可能需要将其转换为unsigned int
并使用%u
。
(✪ω✪)Fight!!(o-)
(๑>₃<)۶ 一心向学