初学者常犯:编程等号与数学等号划等号
刚学编程的娃,非常容易在一个地方栽跟头,就是等号。他们常将编程中的等号与数学中等号划等号。实际上二者的意义完全不同,本文将详细介绍其差异,并提出一种防止出错的好的编程习惯。
一、编程= vs 数学=
1.1 意义不同
1.1.1 等号的意义
在数学中,等号(=)表示一种逻辑关系,只表示左右两边相等。
在C语言中,等号(=)表示赋值操作,即将右侧的值存放到左侧的变量中。
也就是说:
1.1.2 案例展示
用一个简单的例子最能表现出二者的不同。
a=a+1这个式子在数学中显然是不成立的,但在C语言中却是成立的,它表示将变量a的值加1,再赋给变量a。
#include<stdio.h>
int main(){
int a=1;
a=a+1;
printf("%d", a); //输出2
return 0;
}
1.1.3 变量和等号
变量是啥?你可以把它想象成一个装东西的盒子,盒子里的内容可以变来变去。而等号,就是那个用来往盒子里放东西的工具,你可把它想象成传送带。
1.2 用法不同
1.2.1 类据类型转换
数学中,等号两边可以是数字、字母,甚至是复杂的表达式,只要它们算出来的结果一样就OK。然而,在编程里,等号可挑剔了!它要求等号两边的类型得匹配。比如:
int a = 9527;
double b = a;
这里,变量a的数据类型是整型(int),而变量b是浮点型(double)。把A类型的变量赋给B类型,就是类型不匹配。
要解决这个问题,就得把A类型转换为B类型,再赋给B类型的变量。
好在,这个转换过程是编译器自动搞定的,咱们不用做什么,这个叫隐式类型转换。
但是,在这个转换过程中可能会存在精度损失,比如:
#include <stdio.h>
int main() {
double a = 95.27;
int b = a;
printf("%d\n", b);
return 0;
}
输出结果:95,后面的小数部分被直接舍去了。
1.2.2 连等vs链式赋值
数学中,有一种等式叫连等式,咱们都写过。它的形式是这样的:
1
+
2
×
3
=
1
+
6
=
7
1 + 2 \times3= 1+6 = 7
1+2×3=1+6=7
如果用字母表示,形如:
a
=
b
=
c
a = b = c
a=b=c
它表示3个字母相等。
但是,在编程中,始终别忘了等号代表的是赋值,因此
a
=
b
=
c
a = b = c
a=b=c 表示的是将c的值赋给b,再将b的值赋给a,这种用法叫链式赋值(或连赋值)。
然而,链式赋值看起来挺酷,但复杂的链式赋值会降低代码可读性,甚至还会产生意想不到的错误,还是少用为妙。
有关链式赋值的更多介绍,详见:神经错乱的连赋值
二、C语言真正的等号
在C语言中,双等号(即==)才表示逻辑上的相等关系,它等价于数学中的等号(=)。
初学者在if、while、for等语句中表示逻辑判断时,经常将双等号(==)误用为等号(=),导致运行结果出错(注意是运行结果出错,编译时程序是可以正常通过的,所以这种错误不易发现)。
例如:
#include <stdio.h>
int main() {
int a=1;
int b=2;
printf("a==b的值是%d\n", a==b);
if(a==b) //判断a与b是否相等的正确方式
{
// 该部分将不会执行
printf("我永远躲在暗处看着你!");
}
printf("a=b的值是%d\n", a=b);
if(a=b) //初学者乐园
{
// 该部分将会执行
printf("当a、b不同时,在编程世界,可以有这样一个式子:a=b");
}
return 0;
}
运行结果:
上面的代码中,因为a不等于b,所以输出a==b的结果是0(0代表“假”),故该if语句不会执行;而a=b就是将2赋给变量a,所以输出a=b的结果是2(非零整数都代表“真”),故该if语句会执行。
前面说了,这种混用错误编译时不会报错,因而一旦出现很难发现,所以初学者一定要注意。
三、避免出错的好习惯
有一个很好的编程习惯,可能很多大神都不知道,可以在一定程度上减少这种错误的发生。
这个习惯就是当判断一个数和一个变量是否相等时,要把数放在符号之前。
比如:
#include<stdio.h>
int main(){
int a;
scanf("%d", &a);
if(2==a) //好习惯:将2放在==前面
{
printf("朋友,我猜对了,你就是个2!\n");
}
return 0;
}
此时如果误将==写成=,程序是无法通过编译的。因为在C语言中,赋值运算符是把值赋给变量,等号左边的一定要是变量,2=a不符合语法,编译器遇到这种代码时就会报错,从而起到帮助程序员纠错的作用。
标签:常犯,int,划等号,编程,初学者,printf,1.1,变量,赋值 From: https://blog.csdn.net/jjmhx/article/details/145106159