第二章——C程序设计的初步知识 第四节——基本数据类型转换

第二章——C程序设计的初步知识 第四节——基本数据类型转换

亓翎_Re-Tikara Lv5

隐式转换

  个人理解隐式转换仅仅是在你不声明的情况下将数据类型进行转换的一种方式,是编译器的一种操作。


运算转换:

  即不同数据之间进行运算时,如下:

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

int main()
{
int a = 10;
float b = 20.5;
float c = a + b;
printf("%f", c ) ;

return 0;
}

  运行结果如下:

1
30.500000

  在这个过程中,我们首先定义一个int型变量a,赋值为10,然后定义一个float型变量b,赋值为20.5,将float型变量c赋值为a+b,在运算时,编译器首先会将int型变量a转换为float型,然后与同类型变量b相加输出结果,并将其赋值给float型变量c。

赋值转换:

  把一个值赋给与其不同的变量时,如下:

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
int a = 10;
float b = a;
printf("%f", b ) ;

return 0;
}

  运行结果如下:

1
10.000000

  在这个过程中,我们首先定义一个int型变量a,赋值为10,然后定义一个float型变量b,将int型变量a赋值给float型变量b,编译器首先会将int型变量a转换为float型,然后赋值给float型变量b,输出结果。

输出转换:

  在输出时将格式转换为指定格式,如下:

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main()
{
char a = 'B';
printf("%d", a ) ;

return 0;
}

  运行结果如下:

1
66

  上述代码在执行时,,首先定义一个字符变量a,,在执行输出时,将字符变量a转换为整型变量,然后输出结果。这一过程就是输出转化。


形参与实参

  在讲解下一个过程之前,我们需要了解“实参”和“形参”这两个概念。这两个概念我们在后期会经常使用,要对他们有大致的了解。

形参:

定义:

  形参是函数定义时在函数头部声明的参数,用于接收调用函数时传入的实际值。它们是函数接口的一部分,定义了函数需要哪些输入数据。

特点:

  • 占位符作用:形参在函数定义时只是一个占位符,不占用内存空间,直到函数被调用时才会分配存储空间。
  • 局部性:形参的作用域仅限于函数内部,函数执行结束后,形参的存储空间会被释放。
  • 值传递:在C语言中,形参默认是通过值传递(Call by Value)接收实参的值。这意味着形参是实参的副本,对形参的修改不会影响实参。
  • 类型匹配:形参的类型必须与实参的类型兼容,否则可能导致隐式类型转换或编译错误。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>

void test(int a,int b) //此时a和b就是形参
{
int c = a + b;
return c;
}

int main()
{
int x , y;
int c = test(x ,y);
}

实参:

定义

  实参是函数调用时传递给函数的具体值或表达式。它们是函数执行所需的实际数据。

特点:

  • 来源:实参可以是常量、变量、表达式,甚至是其他函数的返回值。
  • 单向传递:实参的值被传递给形参,但形参的修改不会影响实参(除非通过指针传递地址)。
  • 类型匹配:实参的类型必须与形参的类型兼容,否则可能导致不可预期的结果。

示例:

1
2
3
4
5
6
7
8
#include<stdio.h>

int main() {
int x = 5, y = 10; // x和y是实参
swap(x, y); // 调用swap函数时,x和y作为实参传递
return 0;
}

实参和形参的关系

值传递

  在C语言中,函数参数默认是按值传递的。这意味着实参的值会被复制到形参中,形参和实参是两个独立的变量,存储在不同的内存位置。下面这个例子将会详细给你讲解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;

printf("Inside swap function: a = %d, b = %d\n", a, b);
}

int main()
{
int x = 5, y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(x, y);
printf("After swap: x = %d, y = %d\n", x, y);

return 0;
}

  在上面这段代码中,函数swap()有两个参数,分别是int a 和 int b。这两个参数就是形参,而我们在main()中定义的 int x, int y是实参,而我们在main()中调用swap()函数时,将X和Y的值传递给a和b。形参相当于只是个用来占位的替身,实际上是实参在起作用。这个过程也就是形参和实参相当重要的一个特点:值传递

地址传递

  如果需要让函数修改实参的值,可以通过传递变量的地址(指针)来实现。此时,形参是一个指针,指向实参的内存地址。指针这一块我们在这里大致举例即可,后面会详细讲解。

1
2
3
4
5
6
7
8
9
10
11
void increment(int *a) {
(*a) += 1; // 通过指针修改实参的值
printf("Inside function: %d\n", *a);
}

int main() {
int x = 5;
increment(&x); // 传递x的地址
printf("Outside function: %d\n", x); // x的值变为6
return 0;
}

  在这个例子中,函数increment()的参数是一个指针,指向一个int类型的变量。在函数中,通过指针修改实参的值。然后,在main()中,我们调用increment()函数,并传递x的地址。这样,函数修改了x的值,并返回了修改后的值。


  形参实参大致讲解到这,让我们继续回到隐式转换。


函数调用转换:

  函数调用转换是指,当函数调用时,编译器会根据函数的参数和返回值类型,将实参转换为形参的类型。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int add(int a, int b)
{
int c = a + b;
return c;
}

int main()
{
char x = 'A', y = 'B';
int z = add(x, y);
printf("%d", z);
return 0;
}

  在这个例子中,函数add()的参数是int型,返回值也是int型。在main()中,定义了三个变量x,y,z,并调用add()函数,将字符变量x和y作为实参传递给add()函数。编译器会根据函数的参数和返回值类型,将x和y转换为int型,然后调用add()函数,将转换后的实参传递给形参a和b。函数add()返回一个int型结果,将结果赋给z。最后,输出z的值。


运算转换规则

  以上就是C语言中基本的隐式转换,我们可以总结出运算转换的规则如下:不同类型的数据运算时先自动转换为同一类型,然后在执行其余步骤。


不同数据类型之间转换顺序

.png
  在这幅图中,横向的箭头是一定会执行的转换,纵向的箭头是不同类型之间执行的转换,同时,低位会向高位转换。例如:

1
2
3
4
5
6
7
char ch;
int i;
float f;
double d;

ch/i + f*d - (f+i)

  这一过程中,因为char型的ch一定会转换为int型,所以会先将ch转换为int型,然后float型的f一定转换给double型,转换完后,在运算时因为存在最高的double,所以int会向高位转换给double,所以最后输出的就是double。


显式转换

  显式转换(又叫强制转换),是我们常用的一种方式。

一般形式:

(类型名)(表达式)

  比如:

1
2
3
int a = 10;
float b = (float)a;
printf("%f",b);

  在上述代码中,我们把int型变量a强制转换为float型变量b,并输出b的值。

说明:

  强制转换得到所需类型的中间变量,原变量不变。(在转换过程中,常伴有精度损失等问题,常发生在较高类型转换为较低类型时)

  • 标题: 第二章——C程序设计的初步知识 第四节——基本数据类型转换
  • 作者: 亓翎_Re-Tikara
  • 创建于 : 2026-02-07 02:21:28
  • 更新于 : 2026-02-07 02:26:19
  • 链接: https://re-tikara.fun/Blog/posts/e4dc0678/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。