//2020年9月12日16:08:54
三.运算符和表达式
1.基本概念
1.1 运算符
1.1.1 运算符操作数的概念 :当前运算符需要几个数字运算
1.1.2 左值和右值
左值:变量
右值:一般没有要求
1.2 优先级和结合性的概念
1.2.1 优先级 算东西先后顺序
逗号 赋值 条件 位 算术 括号系列
1.2.2 结合性 :读法: 从右往左 从左往右
一般就是赋值语句和位运算以及++和 - - 从右往左
2.基本运算符
2.1 赋值运算符
#include <stdio.h>
int main()
{
int a=1;
int result=a;
//错误,Num一定是要存在的东西
//int inumber=Num=1;
//赋值语句的准则: 运算符两边的类型要一致 ,以左边为标准
int iNum=1.11;
//“=”:“int *”与“int (*)[3]”的间接级别不同
return 0;
}
2.2 算术运算符
#include <stdio.h>
int main()
{
int a = 1, b = 2;
int result = a * b;
//注意点,不存在省略的写法
//错误代码: a(a+b)
//result = a(a + b);
//除法/
result = a / b;
//注意点: 自动取整问题
//1/2+1/3+1/4
printf("result=%.3f\n", 1 / 2.0 + 1 / 3.0 + 1 / 4.0);
//取余 %
int num = 123;
int num1 = num % 10; //num1=123%10 =3
num=num/10; //num=123/10=12
int num2 = num % 10;
num = num / 10;
int num3 = num % 10;
printf("%d,%d,%d\n", num1, num2, num3);
//正负问题
printf("%d\n", -2 % 3);
printf("%d\n", 2 % -3);
return 0;
}
2.3 复合赋值运算符
#include <stdio.h>
int main()
{
int a=1;
a+=1; //解释为a=a+1
a/=1; //解释为a=a/1
a*=2; //解释为a=a*2
//注意点
int b=2;
int result=3;
result*=a+b;
return 0;
}
3.条件和逻辑运算符
3.1 条件表达式和逻辑表达式的值只有两个:0和1
3.2 0和1 表示含义 是:成立和不成立或者是真和假
3.3 计算机中真和假 : 所有非零值都是真 只有0或者NULL 才是假的
3.4 条件表达式
#include <stdio.h>
int main()
{
//> <
printf("%d\n",1>2); //打印结果是0
//== != >= <=
//注意点:1.不要把等于号写成赋值语句
// 2.!=中间没有空格
// 3. 不存在连续操作
printf("%d\n",1==1);
printf("%d\n",2<1<4); //2<1只有两个值[0,1] 永远都是小于4
//怎么去写条件
return 0;
}
3.5 逻辑运算符
3.5.1 逻辑运算符: && 并且 || 或者 !: 取反(否定) 真变 假,假变真
表达式1&&表达式2 只有当表达式1和2都成立(真的) ,整个才是真的,其他情况都是假的
表达式1||表达式2 只有当表达式1和2都不成立(假的) ,整个才是假的,其他情况都是真的
#include <stdio.h>
int main()
{
//并且
printf("%d\n", 1 && 1);
printf("%d\n", 1 && 0);
printf("%d\n", 0 && 1);
printf("%d\n", 0 && 0);
int a = 3;
printf("%d\n", a > 1 && a < 4); //等效数学中:1<a<4
//或者
printf("%d\n", 1 || 1);
printf("%d\n", 1 || 0);
printf("%d\n", 0 || 1);
printf("%d\n", 0 || 0);
printf("%d\n", a > 1 || a < 4);
//取反: 真的变假 ,假的变真
//计算机中非零值表示真
printf("!-3=%d\n", !-3); //逻辑取反
//注意点:
return 0;
}
3.5.2 短路现象:计算偷懒
0&&x 表达式第一部分是0 那么 整个表达式的值就是0 所以计算机不会去走x
1||x 表达式第一部分是1那么 整个表达式的值就是1 所以计算机不会去走x
#include <stdio.h>
int main()
{
int x = 3;
int y = 2;
int result = x > 1 || (y = 3);
printf("result=%d\tx=%d\ty=%d\n", result, x, y);
result = x < 1 && (y = 10);
printf("result=%d\tx=%d\ty=%d\n", result, x, y);
return 0;
}
4.特殊运算符
4.1 三目运算符
表达式1?表达式2:表达式3
整个表达式: 表达式1是真的 取表达式2的值 反之 取表达式3的值
#include <stdio.h>
int main()
{
int result = 1 > 2 ? 1 : 2;
printf("%d", result);
//求最大值
int a = 2, b = 3;
int max = a > b ? a : b;
return 0;
}
4.2 逗号运算符: 取逗号表达式的最后一部分
#include <stdio.h>
int main()
{
int result = 1 > 2 ? 1 : 2;
printf("%d\n", result);
//求最大值
int a = 2, b = 3;
int max = a > b ? a : b;
printf("%d\n", (1, 2, 3, 4, 5, 6, 7));
//优先级 逗号是最低
a = 1, 2, 3, 4, 5, 6, 7;
printf("%d\n", a);
a = (1, 2, 3, 4, 5, 6, 7);
printf("%d\n", a);
return 0;
}
4.3 自增自减运算符
4.3.1 基本操作
++: a++ 解释 a=a+1
––: a–– 解释为a=a-1
4.3.2 前置和后置的理解
前置: ++a 先做自增,先改变自己,在去用自己
后置: a++ 先用自己 ,再改变自己
#include <stdio.h>
int main()
{
a = 0;
result = 0;
result = ++a;
printf("result:%d\ta:%d\n", result, a);
a = 0;
result = 0;
result = a++;
printf("result:%d\ta:%d\n", result, a);
return 0;
}
4.4 sizeof运算符
用法: sizeof(类型/变量): 当前变量 或者类型所占用字节数
注意点: 是在编译器完成