排序逻辑与赋值运算符

排序逻辑与赋值运算符

背景

今天上课做题的时候碰见一个有趣的题目,关于怎么排序

这是题干:

1
2
3
4
请进行程序设计,从键盘上输入三个字符,根据其在计算机内的存储方式按照从小到大的顺序输出这三个字符。
字符输入方式可以使用scanf()或者getchar()
输入格式:"%c%c%c"
输出格式:"%c %c %c\n"

根本不会写,后来问了豆包,我写的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main()
{
char k,f,c,pron;
scanf("%c%c%c",&k,&f,&c);
if(k>f){
pron=k;
k=f;
f=pron;
}
if(k>c){
pron=k;
k=c;
c=pron;
}
if(f>c){
pron=f;
f=c;
c=pron;
}
printf("%c %c %c\n",k,f,c);
return 0;
}

排序逻辑

核心是通过“两两比较、交换位置”的方式,把最小的放到最前面,中间的放中间,最大的放最后。

以输入的三个字符 a、b、c 为例,我们的目标是让 a ≤ b ≤ c (这里的“≤”是按字符的ASCII码比较)。

第一步:确保 a 是 a 和 b 中较小的

比如输入的 a=’r’ 、 b=’d’ :

  • 因为 ‘r’ > ‘d’ ,所以交换 a 和 b ,交换后 a=’d’ 、 b=’r’ 。
  • 这一步完成后, a 一定是 a、b 里更小的那个。

第二步:确保 a 是三个字符中最小的

经过第一步, a 已经是 a、b 里最小的了,但还要和 c 比:
比如现在 a=’d’ 、 c=’k’ :

  • 因为 ‘d’ < ‘k’ ,不需要交换;
    如果 c 更小(比如 c=’a’ ),就交换 a 和 c ,让 a 变成最小的。
  • 这一步完成后, a 一定是三个字符中最小的那个。

第三步:确保 b 是剩下两个里较小的

经过前两步, a 已经是最小的了,现在只需要比较 b 和 c :
比如现在 b=’r’ 、 c=’k’ :

  • 因为 ‘r’ > ‘k’ ,交换 b 和 c ,交换后 b=’k’ 、 c=’r’ 。
  • 这一步完成后, b 一定是 b、c 里更小的,而 a 已经是最小的,所以最终 a ≤ b ≤ c 。

举个具体例子(对应题目输入 dnk )

输入的三个字符是 a=’d’ 、 b=’n’ 、 c=’k’ :

  1. 第一步:比较 a 和 b ( ‘d’ < ‘n’ )→ 不用交换, a=’d’ 、 b=’n’ ;
  2. 第二步:比较 a 和 c ( ‘d’ < ‘k’ )→ 不用交换, a 还是最小的;
  3. 第三步:比较 b 和 c ( ‘n’ > ‘k’ )→ 交换 b 和 c ,交换后 b=’k’ 、 c=’n’ ;

最终结果就是 a=’d’ 、 b=’k’ 、 c=’n’ ,输出 d k n (和题目示例一致)。

总结

这个逻辑的本质是:

  • 先把最小的字符“挑出来”放到 a 的位置;
  • 再把剩下两个里较小的放到 b 的位置;
  • 最后剩下的 c 自然是最大的。

相当于“先定最小的,再定中间的,最后定最大的”,是不是更清楚啦~

定义temp变量在这里的作用

要理解 temp 的作用,首先得明确“交换两个变量的值”的逻辑——需要一个“临时容器”来暂存数据,避免交换时数据被覆盖丢失

  1. temp 的含义

temp 是一个临时变量( temp 是“temporary(临时)”的缩写),用来临时存储字符的值,辅助完成两个字符变量的交换。

  1. 交换的实现过程(以 if (a > b) 的交换为例)

假设输入的 a=’d’ 、 b=’n’ (实际是字符对应的ASCII码值比较, ‘d’ 的ASCII是100, ‘n’ 是110,所以 a > b 不成立;这里举个反例,比如 a=’n’ 、 b=’d’ ,此时 a > b 成立):

  • 初始状态: a=’n’ , b=’d’
  • 第一步: temp = a; → 把 a 的值( ‘n’ )暂存到 temp 里,此时 temp=’n’
  • 第二步: a = b; → 把 b 的值( ‘d’ )赋值给 a ,此时 a=’d’
  • 第三步: b = temp; → 把 temp 里暂存的 ‘n’ 赋值给 b ,此时 b=’n’

最终 a=’d’ 、 b=’n’ ,完成了 a 和 b 的交换,实现了 a ≤ b 。

  1. 整个排序中 temp 的作用

代码里的3次 if 判断,都是通过 temp 做“临时容器”,依次保证:

  • 第一次 if : a ≤ b
  • 第二次 if : a ≤ c (此时 a 已经是前两个里最小的,再和 c 比较,确保 a 是三个里最小的)
  • 第三次 if : b ≤ c (此时 a 是最小的,再调整 b 和 c 的顺序,最终 a ≤ b ≤ c )

简单说: temp 就像一个“中转站”,在交换两个变量时,先把其中一个值存起来,避免交换过程中数据被覆盖,从而完成两个变量的数值互换。

注意

在C语言中,赋值运算符 = 的逻辑是“把右边的值,赋给左边的变量”,核心是“右值给左变量”,所以等号两边的位置绝对不能交换,交换后逻辑会完全改变(甚至报错)。

具体逻辑关系:

  • 等号左边:必须是一个“可被赋值的变量”(也叫“左值”,是内存中有明确存储地址的容器)。
  • 等号右边:可以是“变量、常量、表达式”(也叫“右值”,是一个具体的数值/结果)。

C语言的 =“右→左”的赋值方向,右边是“数据源”,左边是“数据的存储目标”,位置一旦颠倒,逻辑就会错误。


排序逻辑与赋值运算符
http://example.com/2025/11/16/排序逻辑与赋值运算符/
作者
王柏森
发布于
2025年11月16日
许可协议