目录
一、算数操作符:+、-、*、/、%
1.1 + 和 -
1.2 *
1.3 /
1.4 %
二、赋值操作符:= 和符合赋值
2.1 连续赋值
2.2 复合赋值(自操作)
三、单目操作符:++、--、+(正号)、-(负号)
3.1 ++ 和 --
3.1.1 前置++
3.1.2 后置++
3.1.3 前置--
3.1.4 后置--
3.2 正号(+) 和负号(-)
四、强制类型转换
五、关系操作符
六、条件操作符
七、逻辑操作符:&&、||、!
7.1 逻辑取反运算符
7.2 与运算符
7.3 或运算符
7.4 短路
一、算数操作符:+、-、*、/、%
1. 算术操作符分别是: +、-、*、/、%,这些操作符都是双⽬操作符(有两个操作数)。
2. 注:操作符也被叫做运算符,是不同的翻译,意思是⼀样的。
1.1 + 和 -
1. + 和 - 用来完成加法和减法。
2. 示例代码如下图:
1.2 *
1. 运算符 * ⽤来完成乘法。
2. 示例代码如下图:
1.3 /
1. 运算符/⽤来完成除法,除号的两端如果是整数,执⾏的是整数除法,得到的结果是商。
2. 示例代码如下图:
3. 上⾯⽰例中,尽管变量 x 的类型是 float (浮点数),但是 6 / 4 得到的结果是 1.0 ,⽽不是 1.5 ,原因就在于 C 语⾔⾥⾯的整数除法计算的结果是商,余数部分被被丢弃。
4. 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
5. 示例代码如下图:
5. 示例代码如下图:
6. 上⾯的代码,你可能觉得经过运算, score 会等于 25 ,但是实际上 score 等于 0 。这是因为 score / 20 采用的是整数除法,(score / 20)会得到⼀个整数值 0 ,所以乘以 100 后得到的也是 0 。 为了得到预想的结果,可以将除数 20 改成 20.0 ,让整数除法变成浮点数除法。
1.4 %
1. 运算符 % 表⽰取模运算,即返回两个整数相除的余值;这个运算符只能⽤于整数,不能⽤于浮点数。
2. 示例代码如下图:
3. 负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
4. 示例代码如下图:
5. 上⾯⽰例中,第⼀个运算数的正负号( 11 或 -11 )决定了结果的正负号。
二、赋值操作符:= 和符合赋值
1. 在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
2. 赋值操作符 = 是⼀个随时可以给变量赋值的操作符。
2.1 连续赋值
1. 赋值操作符也可以连续赋值,如:
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。
2. C语⾔虽然⽀持这种连续赋值,但是写出的代码不容易理解,建议还是拆开来写,这样⽅便观察代码的执⾏细节。
2.2 复合赋值(自操作)
1. 在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a = 10;
a = a+3;
a = a-2;
2. 这样代码C语⾔给提供了更加⽅便的写法:
int a = 10;
a += 3;
a -= 2;
3. C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
+=、-=、*=、 /=、 %=
>>=、<<=、 &=、 |=、^=
三、单目操作符:++、--、+(正号)、-(负号)
1. C语⾔中还有⼀些操作符只有⼀个操作数,被称为单⽬操作符。 ++、--、+(正)、-(负) 就是单⽬操作符的。
3.1 ++ 和 --
1. ++是⼀种⾃增的操作符,⼜分为前置++和后置++,--是⼀种⾃减的操作符,也分为前置--和后置--。
2. 单独写前置和后置表达的效果是一样的,例如:++a 和 a++ 表达的都是a自加1。
3.1.1 前置++
1. int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
2. 计算⼝诀:先+1,后使⽤;
3. a原来是10,先+1,后a变成了11,再使⽤就是赋值给b,b得到的也是11,所以打印的结果,a和b都是11,上面的代码相当于这样的代码:
int a = 10;
a = a+1;
b = a;
printf("a=%d b=%d\n",a , b);
3.1.2 后置++
1. int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
2. 计算⼝诀:先使⽤,后+1;
3. a原来是10,先使⽤,就是先赋值给b,b得到了10,然后再+1,然后a变成了11,所以打印的结果 a是11,b是10,上面的代码相当于这样的代码:
int a = 10;
int b = a;
a = a+1;
printf("a=%d b=%d\n",a , b);
3.1.3 前置--
1. 计算⼝诀:先-1,后使⽤;
2. int a = 10;
int b = --a;//--的操作数是a,是放在a的前⾯的,就是前置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 9
3.1.4 后置--
1. 计算⼝诀:先使⽤,后-1;
2. int a = 10;
int b = a--;//--的操作数是a,是放在a的后⾯的,就是后置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 10
3.2 正号(+) 和负号(-)
1. 这⾥的+是正号,-是负号,都是单⽬操作符。
2. 运算符 + 对正负值没有影响,是⼀个完全可以省略的运算符,但是写了也不会报错。
int a = +10; 等价于 int a = 10;
3. 运算符 - ⽤来改变⼀个值的正负号,负数的前⾯加上 - 就会得到正数,正数的前⾯加上 - 会得到负数。但是int a = --10;//err,--会被认为是前置--,且--操作符的操作数必须是可修改的值,而不能是常量,写成int a = -+10是可以的。
int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c);//这⾥的b和c都是-10
int a = -10;
int b = -a;
printf("b=%d\n", b); //这⾥的b是10
四、强制类型转换
1. 语法形式:(类型)
2. int a = 3.14; //a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告。
3. 为了消除这个警告,我们可以使⽤强制类型转换:int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分。
4. 俗话说,强扭的⽠不甜,我们使⽤强制类型转换都是万不得已的时候使⽤,如果不需要强制类型转化 就能实现代码,这样⾃然更好的。
五、关系操作符
1. C 语⾔⽤于⽐较的表达式,称为“关系表达式”,⾥⾯使⽤的运算符就称为“关系运算符”,主要有下⾯6个:
> ⼤于运算符
< ⼩于运算符
>= ⼤于等于运算符
<= ⼩于等于运算符
== 相等运算符
!= 不相等运算符
2. 关系表达式的结果为真返回1,为假返回0。
3. C 语⾔中,0 表⽰假,所有⾮零值表⽰真,例如,20 > 12 返回 1 ,12 > 20 返回 0 。
4. 关系表达式常⽤于 if 或 while 结构。
if (x == 3)
{
printf("x is 3.\n");
}
5. 注意:相等运算符 == 与赋值运算符 = 是两个不⼀样的运算符,不要混淆。有时候,可能会不⼩⼼写 出下⾯的代码,它可以运⾏,但很容易出现意料之外的结果。
if (x = 3) ...
6. 上⾯⽰例中,原本的意思是 x == 3 ,但是不⼩⼼写成 x = 3,此时这个式⼦表⽰对变量 x 赋值3 ,它的返回值为 3 ,所以 if 判断总是为真。 为了防⽌出现这种错误,有的程序员喜欢将变量写在相等运算符的右边,例如 if (3 == x) ... 这样的话,如果把 == 误写成 = ,编译器就会报错,因为赋值表达式的左边必须是可以修改的左值。
/* 报错 */
if (3 = x) ...
7. 另⼀个需要避免的错误是:多个关系运算符不宜连⽤。
i < j < k //err
8. 上⾯⽰例中,连续使⽤两个⼩于运算符。这是合法表达式,不会报错,但是通常达不到想要的结果, 即不是保证变量 j 的值在 i 和 k 之间。因为关系运算符是从左到右计算,所以实际执⾏的是下⾯的表达式
(i < j) < k
9. 上⾯式⼦中, i < j 返回 0 或 1 ,所以最终是 0 或 1 与变量 k 进⾏⽐较。如果想要判断变量 j 的值是否在 i 和 k 之间,应该使⽤下⾯的写法
i < j && j < k
10. ⽐如:我们输⼊⼀个年龄,如果年龄在18岁~36岁之间,我们输出⻘年,如果我们这样写,当我们输⼊10 的时候,依然输出⻘年。
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(18<=age<=36)
{
printf("⻘年\n");
}
return 0;
}
11. 这是因为,我们先拿 18 和 age 中存放的10⽐较,表达式18<=10为假, 18<=age 的结果是0,再拿 0 和 36⽐较,0<=36为真,所以打印了⻘年,所以即使当age是10的时候,也能打印⻘年 ,逻辑上是有问题的,修改代码如下。
12. #include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if(age>=18 && age<=36)
{
printf("⻘年\n");
}
return 0;
}
六、条件操作符
1. 条件操作符也叫三⽬操作符(C语言中唯一的三目操作符),需要接受三个操作数的,形式如下:exp1 ? exp2 : exp3
2. 条件操作符的计算逻辑是:如果 exp1 为真, exp2 计算,计算的结果是整个表达式的结果;如果 exp1 为假, exp3 计算,计算的结果是整个表达式的结果。
#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);if (a > 5)b = 3;elseb = -3;//上面四行代码可以直接写成:b = a > 5 ? 3 : -3;printf("%d\n", b);return 0;
}
//使⽤条件表达式实现找两个数中较⼤值
#include <stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int m = a > b ? a : b;printf("%d\n", m);return 0;
}
七、逻辑操作符:&&、||、!
1. 逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
! :逻辑取反运算符(改变单个表达式的真假),单目操作符
&& :与运算符,就是并且的意思(一假则假)
|| :或运算符,就是或者的意思(一真则正)
7.1 逻辑取反运算符
1. ⽐如,我们有⼀个变量叫 flag,如果flag为假,要做⼀个什么事情,就可以这样写代码:
#include <stdio.h>
int main()
{
int flag = 0;
if(!flag)
{
printf("do something\n");
}
return 0;
}
2. 如果 flag 为真, !flag 就是假,如果 flag 为假, !flag 就是真 所以上⾯的代码的意思就是 flag 为假,执⾏if语句中的代码。
7.2 与运算符
1. && 就是与运算符,也是并且的意思, && 是⼀个双⽬操作符,使⽤的⽅式是 a&&b , && 两边的表达式都是真的时候,整个表达式才为真,只要有⼀个是假,则整个表达式为假。
2. ⽐如:如果我们想表示⽉份是3⽉到5⽉,是春天。
int month = 0;
scanf("%d", &month);
if (month >= 3 && month <= 5)
{
printf("春季\n");
}
3. month >= 3 && month <= 5 这⾥表达的意思就是 month 既要⼤于等于3,⼜要⼩于等于5,必须同时满⾜。
7.3 或运算符
1. || 就是或运算符,也就是或者的意思, || 也是⼀个双⽬操作符,使⽤的⽅式是 a || b ,|| 两边的表达式只要有⼀个是真,整个表达式就是真,两边的表达式都为假的时候,才为假。
2. ⽐如:如果我们想表示⼀年中⽉份是12⽉或者1⽉或者2⽉是冬天。
int month = 0;
scanf("%d", &month);
if(month == 12 || month==1 || month == 2)
{
printf("冬季\n");
}
//输⼊⼀个年份year,判断year是否是闰年
//闰年判断的规则:
//1. 能被4整除并且不能被100整除是闰年
//2. 能被400整除是闰年
int main()
{int year = 0;scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))printf("是闰年\n");return 0;
}
7.4 短路
1. C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值,这种情况称为“短路”。
2. if(month >= 3 && month <= 5)
3. 上面的表达式中&& 的左操作数是 month >= 3 ,右操作数是 month = 3 的结果是0的时候,即使不判断 month <= 5 ,整个表达式的结果也是0(不是春季),所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
4. if(month == 12 || month==1 || month == 2)
5. 上面的表达式中如果month == 12,则不⽤再判断month是否等于1或者2,整个表达式的结果也是1(是冬季),所以, || 操作符的左操作数的结果不为0时,就⽆需执⾏右操作数。
6. 练习:阅读代码,计算代码输出的结果
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);//1 2 3 4
return 0;
}
本篇文章已完结,谢谢支持哟 ^^ !!!