系列连载
- 【python / C / C++】
参考
- 《C语言程序设计(第四版)谭浩强》
- 【C语言】C语言视频教程
- 《郝斌 C 语言自学教程》
文章目录
- 1 运算符
- 1.1 基本的算术运算符
- 2 表达式
1 运算符
1.1 基本的算术运算符
注意,+ 是右结合的
“=” 具有左结合性,结果赋值给左边,eg x = y = z
等价于 x = (y = z)
#include "stdio.h"
void main()
{
printf("%d, %d\n", 20/7,-20/7);
printf("%d, %d\n", 20%7,-20%7);
printf("%f, %f\n", 20.0/7,-20.0/7);
}
output
2, -2
6, -6
2.857143, -2.857143
注意 % 不能作用在 double 上
- 运算符的优先级
- 运算符的结合性(左结合性—右向左,右结合性—左向右)
运算符
算数运算符
+, -, *, /, %(取余)
注意 10.5%3 会报错,% 左右必须为整数
关系运算符
>, >=, <, <=, !=, ==
逻辑运算符
!, &&(且), ||(获)
先来个简单的
#include<stdio.h>
int main(void)
{
int i = 10;
int k = 20;
int m;
m = (3 > 2) && (k = 5);
printf("k = %d, m = %d\n", k, m);
return 0;
}
输出为
k = 5, m = 1
把 m 的赋值语句改为 m = (3 > 2) && (k = 0);
结果为
k = 0, m = 0
把 m 的赋值语句改为 m = (1 > 2) && (k = 5);
结果为
k = 20, m = 0
哈哈哈,
&& 从左到右运行,左边的表达式为假,右边的表达式不会执行,k = 5 没有运行
把 m 的赋值语句改为 m = (1 > 2) || (k = 5);
k = 5, m = 1
把 m 的赋值语句改为 m = (3 > 2) || (k = 5);
k = 20, m = 1
|| 左边表达式是真的时候,右边不执行
赋值运算符
=, +=, *=, /=, -=
一些琐碎的运算符知识
自增[或者自减]
-
分类
- 前自增 ++i
- 后自增 i++
-
异同
- 相同:最终都是使 i 的值加1
- 不同:前自增整体表达式的值是 i 加 1 之后的值(先加再用),后自增整体表达式的值是 i 加 1 之前的值(先用再加)
-
为什么会出现自增
- 代码更精炼
- 自增的速度更快
-
学习自增要明白的几个问题
- 尽量屏蔽掉前自增和后自增的差别
- 自增表达式最好不要作为一个更大的表达式的一部分来使用
int m = i++ + ++i +i + i++
#include<stdio.h>
int main(void)
{
int i = 3;
int j = 3;
int p,q;
p = ++i;
q = j++;
printf("i = %d, j = %d, p = %d, q = %d \n", i,j,p,q);
return 0;
}
output
i = 4, j = 4, p = 4, q = 3
三目运算符
逗号表达式
#include<stdio.h>
int main(void)
{
int i = (3,4,5,6);
printf("i = %d\n", i);
return 0;
}
output
i = 6
再看个比较有意思的
#include<stdio.h>
int main(void)
{
int i;
int j = 2;
i = (j++,++j,j+2,j-3);
printf("i = %d\n", i);
return 0;
}
output
i = 1
j++
和 ++j
会改变 j
的值,j+2
不会
优先级别
算术>关系>逻辑>赋值
2 表达式
……
未完待续