目录
- C语言快速入门
- C语言快速入门 - Hello World 详解
- C语言快速入门 - 变量
- C语言快速入门 - 简单运算符
- C语言快速入门 - 控制语句
快速回顾
还记得上一篇文章的那个例子吗,就是那个加法器,这次,我们要做一个升级版了!
好吧,其实就是加减乘除都来一遍,没什么难度。
#include <stdio.h>
int main()
{
double a, b;
scanf("%lf %lf",&a, &b);
printf("%lf + %lf = %lf\n", a, b, a + b);
printf("%lf - %lf = %lf\n", a, b, a - b);
printf("%lf * %lf = %lf\n", a, b, a * b);
printf("%lf / %lf = %lf\n", a, b, a / b);
return 0;
}
运行结果
可能输出上并不怎么尽人意,但毕竟功能上已经实现了。
怎么样,+
, -
, *
, /
简单吧。
那么我们在测试下他们的组合吧。
printf("%d",1 + 3 * 4);
输出
13
这么说,先乘除后加减的规则也是遵守的。
那么是不是应该有括号呢?
不要急,这不就来了吗。
printf("%d",(1 + 3) * 4);
这样,他就输出了16了。
那么,C语言就这么些操作符吗?当然不是,这还只是冰山一角。
常见的还有:
操作符 | 作用 |
---|---|
% |
取模(余数) |
++ |
自加1 |
-- |
自减1 |
+= |
a += 2; 等同于a = a + 2; ,自加,一种简写 |
-= |
a -= 2; 等同于a = a - 2; ,自减 |
*= |
与上面类似,自乘 |
/= |
自除 |
%= |
自模 |
但是这边自加1、自减1要注意下,有两种写法:
int a = 1;
a ++;
经过上面的代码,a
的值不用想,最终就是2。
同样的,下面这样写a
的最终值也是2。
int a = 1;
++ a;
这就是两种写法,这样用当然没有区别。
但是,下面的写法就有区别了:
int a = 1;
int b = a ++;
int c = ++ a;
首先,a
经过了两次自加1,所以最终a = 3,那b和c的值为多少呢?事实上,b = 1,c = 3。
怎么个回事呢?是这样的,a ++
先把a的值给了b,然后自己在自加了1。而++ a
恰恰相反,他先自加了1,此时a的值为3,然后它再把值给了c,所以造成c也等于3的结果。
巧记:a ++里的a在++前面,所以在自加之前把a给出去,++ a里的a在++后面,所以是自加之后再把a给出去。
--
也是一样的。
逻辑运算符
在电脑里,只有0/1两中状态,那么我们可以说要么真要么假,没有第三者。
这时候逻辑运算符便出现了,它是专门为了处理真和假的一种运算符,理解起来也很容易。
与
与,也就是AND,他的真值表是这样的,A代表输入1,B代表输入2,Y是输出。(0代表假,1代表真)
A | B | Y |
---|---|---|
0 | 1 | 0 |
1 | 0 | 0 |
0 | 0 | 0 |
1 | 1 | 1 |
也就是说只有两个都为真,结果才为真。
或
或,OR,还是直接看真值表吧。
A | B | Y |
---|---|---|
0 | 1 | 1 |
1 | 0 | 1 |
0 | 0 | 0 |
1 | 1 | 1 |
只要有一个1,那结果就为1。
非
因为真/假只有两种状态,所以非运算就是把0变成1,把1变成0的运算。
说完了这些概念,那么我们还是看看程序里是怎么用的吧。
#include <stdio.h>
int main()
{
int a = 0, b = 1;
int y;
y = a && b;
printf("0 && 1 = %d\n", y);
a = a || b;
printf("0 || 1 = %d\n", a);
y = a && b;
printf("1 && 1 = %d\n", y);
y = !y;
printf("!1 = %d\n", y);
return 0;
}
输出
0 && 1 = 0
0 || 1 = 1
1 && 1 = 1
!1 = 0
C语言中,&&是与运算符,||是或,!是非,用法就在上面的例子里啦。
但是呢,有一点需要注意的是,我上面用的是int类型,也就是说a
和b
可以储存好多数字,不仅仅是0和1,那样,又会发生什么样的结果呢?
(注意看)其实,C语言里除了0是假以外都是真,0是假;1, 2, 3, ..., n都是真,连负数-1, -2, -3, ..., -n都是真。所以,!-2 = 0,!12 = 0,但是!0只会等于1,这边注意下就好了。
比较运算符
在数学里,我们会有>
, ≥
, <
, ≤
四种符号,在C语言中同样也有这些符号。
符号 | 作用 |
---|---|
> |
判断左边的是否大于右边的,如果是,整个表达式的值为真,反之则为假 |
>= |
大于等于,用法同上 |
< |
小于,用法同上 |
<= |
小于等于,用法同上 |
== |
等于,注意,这边是两个等于,用于判断左边和右边两个值是否相等,相等则返回真,反之则假 |
例子:
#include <stdio.h>
int main()
{
printf("10 > 5 = %d\n", 10 > 5);
printf("7 >= 7 = %d\n", 7 >= 7);
printf("3 == 1 = %d\n", 3 == 1);
printf("10 < 7 = %d\n", 10 < 7);
printf("2 <= 10 = %d\n",2 <= 10);
return 0;
}
输出:
10 > 5 = 1
7 >= 7 = 1
3 == 1 = 0
10 < 7 = 0
其实他们和其他运算符(+
, -
, *
, /
)没有任何区别,只是他们的结果只有0/1罢了。
特殊运算符
在这里在给大家介绍两种特殊的运算符,可能用的不多,但是用起来还是挺巧的。
首先是特别奇怪的一个运算符:,
逗号。
,
首先,我们来看个例子吧。
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
int c = 2;
a = b + c, b - c, b * c;
printf("%d\n", a);
a = (b + c, b - c, b * c);
printf("%d\n", a);
return 0;
}
输出:
3
2
我们观察程序,可以看出b + c
的值为3,b - c
的值为-1,b * c
的值为2,所以根据输出,我们可以断定,第一次a的值是由b + c
赋的,而第二次则是b * c
。
在小学数学课上我们学过,括号是最先运算的一部分,所以,第二个a = (b + c, b - c, b * c);
中,先计算的便是里面的b + c, b - c, b * c
,那么逗号是怎么样的呢?
逗号是所有运算符优先级最低的,他是最后被运算的,所以在第一个a = b + c, b - c, b * c;
中,计算过程是从左向右,这样进行的:
首先计算的是a = b + c
:编译器先算出b + c
的值,然后赋给a
。
然后就是b - c
了,编译器计算完它就结束了,因为他的计算结果没有给任何变量使用。
最后计算的才是b * c
。
所以,在计算括号里的那部分也是按照这个顺序的,先计算b + c
,然后是b - c
,最后是b * c
,这样就完成了括号里面的计算,他的值便是最后计算的那个b * c
,所以最后a
得到的值也是b * c
的值。
接下来便是我要提到的另一个特殊的运算符了,他是C语言里唯一一个三元计算符。
() ? :
具体是怎么样的,还是看例子吧:
#include <stdio.h>
int main()
{
int a = 0;
int b = 1;
int c = 2;
a = (c > b) ? 10 : 20;
printf("%d\n", a);
return 0;
}
输出
10
我们看a = (c > b) ? 10 : 20;
,在这句话中,我们首先注意到的就是()
,因为他是最先被计算的,那么根据我们的判断,c明显大于b,所以c > b
计算完的结果就是真的了,也就是1。
那么他为什么输出了10呢?
我们继续看这个式子。在()
的后面紧跟了一个?
,在问号的后面则紧跟了10,也就是我们的输出结果,在后面有来了个20。那么问题来了,为什么它输出了10而不是20呢?
这里牵扯到一个条件的判断。() ? :
的意思是假如?
前面的值是真,那么整个式子的结果就是:
前面的那个值,若为假,那么就是后面的那个值。也就是说,刚刚例子中的c > b
的值为真,所以整个式子的结果就是:
前面的那个值了。
所以,(c < b) ? 10 : 20;
的值便为20了。
计算顺序
我们知道()
的计算顺序是最优先的,,
是最后的,先乘除后加减,那么别的计算符呢?我从百度百科上扣了一张表下来,看一下就知道了。
有些运算符我还没介绍到,但是可以先不用管,看已经学的就行了。
注意事项
由于c语言的数据类型的限制,有些时候的加减乘除的法则并没有我们想的那么简单。
我们来看看下面那段程序
int main()
{
int a = 10,b = 2;
int c = a / b;
b = 3;
int d = a / b;
double e = a / b;
return 0;
}
不难看出,c的值一定是5,但是d的值就不是我们想象中的3.333333333了。
事实上,d的值就是3,因为d的类型是int,所以小数点后面的所有东西都会被去掉。
那么e的值呢?e的类型是double,可以保存小数,那么它等于几呢?
其实,e的值还是3,并不是3.3333。
大家一定会很迷惑,为什么会这样。其实,我们可以通过计算顺序来判断一下。
首先,a / b是两个int类型的数字间的运算,那么这边有一个规则:规则1:数据类型相同的两个变量运算结果的变量类型还是原变量类型。
按照计算顺序,我们先是计算a / b的值,然后这边a / b算出来的类型还是int,所以值是3,之后再把这个3赋值给了类型为double的e变量,因此并不是我们所期望的3.3333333。
那么如何让两个int变量算出一个小数来呢?
这变又有另外一个规则了:规则2:数据类型不同的两个变量运算结果的变量类型为其中能表示更多数字的数据类型
什么是能表示更多数字的意思呢?
比如,对于int
和long long
来说,后者数据范围更大,因此int a = 1;long long b = 2;
,最终a + b的类型就是long long
。同样的int
和double
相比,double还能表示小数,而int不行,因此一个int
和一个double
进行运算的时候,最后算出来的数据类型就是double
,而不是int
。
int main()
{
int a = 10;
double b = 3;
int c = a / b;
double d = a / b;
return 0;
}
不难判断,上述例子中,c
的值就是3,d
的值是3.3333333。
但是如果我就是想让两个int变量算出来是一个小数怎么办呢,这边就有一个操作,叫做强制类型转换。
int main()
{
int a = 10, b = 3;
int c = a / b;
double d = (double) a / b;
double e = a / (double) b;
return 0;
}
上述例子中,d和e的值都是3.333333,那么那个(double) a
的作用便是强制把a的变量类型转化成double,从而满足之前说的规则2。同样的,下面的那个(double) b
也是同理。
可能会有人会有疑惑,为什么(double) a / b
算出来是小数,不应该先算a / b = 3之后再转换成double,最后赋值给d,这个强制转换是没有意义的。
但事实上,这边的运算优先级是最先进行强制类型转换的,也就是先通过(double) a
把a转换成double类型之后,在进行后续计算的。
如果真的要没有意义,那可以这么写:double c = (double) (a / b);
这种写法是真的没有任何意义,因为他会先计算a / b = 3,然后转换成double再赋值给c,这个强制类型转换没有起到任何作用。
以上便是所有注意事项,希望大家好好理解规则1和规则2,他们可以帮你排除很多小问题的。
小题目
请判断下面这个程序中的a
的值。
#include <stdio.h>
int main()
{
int a = 0;
int b = 5;
int c = 1;
a = (b ++, c --, ++ b), -- c;
printf("%d\n", a);
return 0;
}
请尝试不用编译器编译运行,用肉眼看出结果,最后在和运行结果对下答案就好了。
结语
本文介绍的运算符较多,一下子记不住不要紧,但是新增的逻辑运算以及这个概念很重要,望大家能掌握,欢迎大家继续看我的我文章,下一篇《C语言快速入门 - 控制语句》。
网友评论