1. 表达式

表达式(expression)由运算符和运算对象组成(运算对象是运算符操作的对象)。最简单的表达式是一个单独的运算对象,以此为基础可以建立复杂的表达式。下面是一些表达式:

1
2
3
4
5
6
7
250
-9
12 + 24
a * (b + c) / d + 100
num = 4 * 5
x = ++y * 3 % 5
r > 5

由此可见,运算对象可以是常量、变量或二者的组合。一些表达式由子表达式(subexpression)组成(子表达式即较小的表达式)。例如:b+c 是上面例子中a * (b + c) / d + 100的子表达式。

C 表达式的一个最重要的特性是,每个表达式都有一个值。要获得这个值,必须根据运算符优先级规定的顺序来执行操作

在上面我们列出的表达式中,前几个都很清晰明了。但是,有赋值运算符(=)的表达式的值是什么?这些表达式的值与赋值运算符左侧变量的值相同。

  • 表达式num = 4 * 5作为一个整体的值是20
  • 表达式r > 5这种关系表达式的值不是0就是1
    • 如果条件为真,表达式的值为1
    • 如果条件为假,表达式的值为0

下表中列出了一些表达式及其值:

image-20230729094054222

虽然最后一个表达式看上去很奇怪,但是在C中完全合法(但不建议使用),因为它是两个子表达式的和,每个子表达式都有一个值。

2. 类型转换

数据有不同的类型,不同类型数据之间进行混合运算时必然涉及到类型的转换问题。转换的方法有两种:

  • 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成。
  • 强制类型转换:把表达式的运算结果强制转换成所需的数据类型。

类型转换的原则:占用内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换,以保证精度不降低,反之就会损失精度,丢失一部分数据。

image-20230729013353385

2.1 隐式类型转换

隐式类型转换(Implicit Type Conversion),也称为自动类型转换或隐式类型提升,是指在编程语言中系统自动进行的数据类型转换过程,不需要程序员显式地进行转换操作。隐式类型转换通常发生在不同数据类型之间,具有不同的取值范围和表示方式。

在C语言中,常见的隐式类型转换包括以下几种情况:

  1. 整数之间的隐式类型转换:当进行不同整数类型之间的运算时,较小的类型会自动转换为较大的类型。

    1
    2
    3
    int a = 5;
    long b = 10;
    long result = a + b;

    上面例子中 a 隐式转换为long类型,然后再进行相加操作。

  2. 浮点数之间的隐式类型转换:当进行不同浮点数类型之间的运算时,较低精度的类型会自动转换为较高精度的类型。

    1
    2
    3
    float a = 3.14;
    double b = 2.71828;
    double result = a * b;

    上面例子中 a 隐式转换为double类型,然后再进行相乘操作。

  3. 整数和浮点数之间的隐式类型转换:在整数和浮点数之间进行运算时,整数会自动转换为浮点数,以便进行运算。

    1
    2
    3
    int a = 5;
    float b = 2.5;
    float result = a * b;

    上面例子中 a 隐式转换为float类型,然后再进行相乘操作。

  4. 字符类型和整数类型之间的隐式类型转换:字符类型会隐式转换为对应的整数值,以便进行运算。

    1
    2
    char c = 'A';
    int result = c + 1;

    上面例子中 c 隐式转换为int类型,然后进行相加操作。

需要注意的是,隐式类型转换可能会导致数据的精度降低或溢出问题,因此在进行数据类型转换时,需要注意数据类型的取值范围和精度,以避免出现意外结果。若想显式地进行类型转换,可以使用强制类型转换操作符进行转换。

2.2 强制类型转换

强制类型转换(Explicit Type Conversion),也称为显式类型转换,是指在编程语言中程序员显式地指定进行的数据类型转换操作。通过强制类型转换,我们可以将一个表达式或变量从一种数据类型转换为另一种数据类型。

在C语言中,进行强制类型转换使用了一种特定的语法,可以在需要转换的表达式或变量前面加上括号,并在括号内指定目标类型:

1
(类型说明符) (表达式)	// 表达式外面的()有时可以省略

以下是强制类型转换的示例:

1
2
3
int a = 5, b = 7;
double result1 = (double) a;
double result2 = (double) (a+b);
  • 第 2 行将a 强制转换为double类型,并将结果赋给变量result1, a 是一个变量,因此括号可以省略。
  • 第 3 行将a+b 强制转换为double类型,并将结果赋给变量result2,a+b是一个加法表达式,此时括号是不能省略的。