变量与运算符

1、变量(补充)

(一)、定义

在程序中,变量实际代表的是计算机内存中的一块存储空间,存储空间的名称就是变量名,其中存储的内容是变量的值,程序中的各种数据如原始数据、中间结果、计算结果等可以放在变量中存起来,就像写在纸上记录下来的一样

定义变量后,在位它赋值前,变量的值不为空,而是随机值,表示值未定义或不明确,

地址:

  • 地址 = 首地址 (首地址+数据类型字节大小)
  • &:取地址符

二、运算符与表达式

(1)表达式

1、表达式的组成

  • 运算符:+、-、*、/、%
  • 表达式:a + b
  • 表达式语句:a + b;

2、运算符

C语言中的运算符

总述

  • 由一个或多个操作数(变量,常量,字面值)及运算符组成的复合C语言规则的式子叫做表达式

  • 表达式经由计算得到的结果称为表达式的值

  • C语言中可以分为左值和右值:
    左值:可以写的内存块(变量)。
    右值:可以读的内存块(变量,常量,字面值)。

  • C语言中的运算符包括:

    • (1) 算术运算符:+ (加) , - (减) ,* (乘) ,/ (除) ,%(取余,模运算) ,++ (自增) ,–(自减)

    • (2) 关系运算符:>(大于) ,<(小于) ,==(等于) ,!=(不等于) ,>=(大于等于) ,<=(小于等于)

    • (3) 逻辑运算:&& (与) ,|| (或) ,! (非)

    • (4) 赋值运算符:
      = (赋值)
      += ,-= ,*=, /= ,%= (算术复合赋值运算符)
      &=, |=,^=,~,>>,<<(位运算复合赋值运算符)

    • (5) 位运算符:&,|,^,~,>>,<<

    • (6) 条件运算符:?:(条件运算符,三目

    • (7) 运算符,三元运算符)

    • (8) 逗号运算符:,(逗号运算符)

    • (9) 指针运算符:&(取地址符) *(寻址符)

    • (10) 求字节运算符:sizeof(获取字节数)

    • (11)特殊运算符:()(括号运算符,更改表达

      式运算顺序),[ ](数组下指针访问成员运算符),·(结构体变量访问成员运算符)

  • 关于运算符的几个重要性质:

    • 优先级:运算符执行的优先级,优先级高的先执行
    • 结合性:当优先级相同时,可以通过结合性确定表达式如何结合来确定执行顺序。
    • 类别:参与当前运算符运算的操作数个数,一元,二元,三元

一、算术运算符

1.1
+、-、*、/、% 都属于二元运算符。
运算规则同数学中的运算规则。
结果是一个值(右值、常量值)。
需要特别注意的地方:
C语言中的算术运算结果的类型,由参与运算的两个操作数类型决定,当两个int进行算术运算时,结果必然也是int类型。(两个整型进行除法运算,实际完成的是整除运算)

1
2
3
4
5
6
7
8
9
int a = 10;
int b = 3;
double c = a/b;// a/b => int / int => int
printf("%f\n", c); // 3.000000
c = (double)a/b;
printf("%f\n", c); // 3.333333c = 1.0*a/b;
printf("%f\n", c); // 3.333333
//

/ 除法运算符 和 % 取余运算符 的右操作数不能为0。
% 取余运算符:取余运算要求左右操作数必须为整数。C语言中取余运算结果的符号由左操作数决定。

1
2
3
4
5
printf("%d\n", 5%3);   //  2
printf("%d\n", 5%-3); // 2
printf("%d\n", -5%3); // -2
printf("%d\n", -5%-3); // -2

1.2
++称之为自增运算符、–称之为自减运算符,都属于一元运算符。
拿++举例:(–规则与++相同)
前自增(前加加):++操作数先在操作数自身基础上自加1,再取操作数的值。
后自增(后加加):操作数++先取操作数的值,再在操作数自身基础上自加1。

1
2
3
4
5
6
int i = 0;printf("%d\n", ++i);  // 1
printf("%d\n", i); // 1
i = 0;
printf("%d\n", i++); // 0
printf("%d\n", i); // 1

二、赋值运算符

2.1 简单赋值运算符

=(简单赋值运算符),是一个二元运算符。
优先级很低(倒数第二低,除了逗号运算符,赋值运算符最低)。结合性从右到左。

1
2
3
4
int a, b;b = a = 10;
printf("%d\n", a); // 10
printf("%d\n", b); // 10

2.2 复合赋值运算符

op=(op表示算术运算符及位运算符)(+=、-=、%=…)a+=3; // 表示在a自身基础上自加3 a = a + 3;

三、关系运算符

(大于)、<(小于)、==(等于)、!=(不等于)、>=(大于等于)、<=(小于等于)二元运算符,结合性从左到右。
<、>=、<= 的优先级要高于 、!=。
关系运算符的优先级小于算术运算符。
关系运算符的结果 1 和 0。(1代表true,0代表false)

四、逻辑运算符

&&(逻辑与,二元运算符)、||(逻辑或,二元运算符)、!(逻辑非,一元运算符)
从结果上来讲,C语言中1代表真,0代表假。
从参与逻辑运算的操作数上来讲,C语言中非0代表真,0代表假。
&& 逻辑与
真 && 真 -> 真 真 && 假 -> 假
假 && 真 -> 假 假 && 假 -> 假
|| 逻辑或
真 || 真 -> 真 真 || 假 -> 真
假 || 真 -> 真 假 || 假 -> 假
! 逻辑非
!真 -> 假
!假 -> 真

1
2
3
4
5
6
7
8
int num;
scanf("%d", &num);// [1,99]
printf("%d\n", num>=1 && num<=99 );// <1 or >99
printf("%d\n", num<1 || num>99 );
int num;scanf("%d", &num);
printf("%d\n", num>=1 && num<=99);
printf("%d\n", !(num<1 || num>99));

逻辑或的短路问题:当左操作数为真时,即可判断表达式结果为真,右操作数不执行。
逻辑与的短路问题:当左操作数为假时,即可判断表达式结果为假,右操作数不执行。

1
2
3
4
5
6
7
int a = 1, b = 1;
printf("%d\n", ++a || ++b);
printf(“a=%d b=%d\n”, a, b); // a=2 b=1
int a = -1, b = -1;
printf("%d\n", ++a && ++b);
printf(“a=%d b=%d\n”, a, b); // a=0 b=-1

五、条件运算符(三元运算符、三目运算符)

一般形式:操作数1 ? 操作数2 : 操作数3
表示的含义:判断操作数1结果是否为真,如果操作数1结果为真,则整个条件表达式的结果为操作数2,否则整个条件表达式的结果为操作数3。
条件运算符是唯一的一个三元运算符,所以有些地方又称条件运算符为三元运算符。

1
2
3
4
5
int num;
scanf("%d", &num);
printf("%s\n", num%21?“奇数”:“偶数”);// %s 表示打印字符串
printf("%s\n", num%2?“奇数”:“偶数”);

六、位运算符

6.1

&(位与)、|(位或)、~(位非)、^(位异或)、<<(位左移)、>>(位右移) 位运算就是直接操作二进制位。运算符含义:&:两个操作数按位进行与运算 (
例如根据ip地址和掩码求网段)
|:两个操作数按位进行或运算
~:将操作数按位进行非运算
^:两个操作数按位进行异或运算异或规则:相同为0,不同为1
0 ^ 0 -> 0 1 ^ 1 -> 0 0 ^ 1 -> 1 1 ^ 0 -> 1
异或特性:一个数a位异或另外一个数b两次,结果还是这个数a本身。交换两个元素的值:

6.2 位移运算符

<<(位左移) >>(位右移)
位移:将操作数的每一位向左(或向右)移动指定位数。位移运算符通常操作对象是无符号整形。位移运算符要求两个操作数都必须是正数。
<< 位左移
操作数1 << 操作数2 : 将操作数1的内存中存储的每一位依次向左移动操作数2位。移出位丢弃,空余位补0,注意有符号数左移会覆盖符号位。
缺陷,通过位异或交换两个数的值要求两个数不能相等
a << b 等价于 a * (2^b)

1
2
3
4
5
6
int a = 0x7fffffff;
a <<= 1; // a = a << 1;
printf("%d\n", a);
// 0111 1111 1111 1111 1111 1111 1111 1111
// 1111 1111 1111 1111 1111 1111 1111 1110

>> 位右移
操作数1 >> 操作数2 : 将操作数1的内存中存储的每一位依次向右移动操作数2位。右移等价于整除2。对于无符号整型,空出位置补0。对于有符号整数,空出的符号位补原符号位。(负整数右移1位等价于整除2上取整)

七、逗号运算符

, (逗号运算符)
一般形式: 操作数1 , 操作数2 :操作数2作为逗号表达式的结果。
二元运算符,从左到右,优先级最低

1
2
3
4
5
6
7
8
int num;
num = 100, 200;
printf("%d\n", num); // 100
num = (100, 200);
printf("%d\n", num); // 200
num = (100, 200, 300, 400, 500);
printf("%d\n", num); // 500

运算符优先级