目录
赋值运算符与条件表达式
赋值运算符支持c语言基本类型,char,int ,double.但是字符换不能使用赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求余数且赋值运算符,求两个操作数的模赋值给左边操作数,浮点数不适用取余数。 | C %= A 相当于 C = C % A |
算数运算符与条件表达式
假设A为18,B为5
运算符 | 描述 | 实例 |
---|---|---|
+ | 两个数相加 | A+B 将得到 23 |
- | 一个数减另一个数 | A-B 将得到 13 |
* | 两个数相乘 | A*B 将得到 90 |
/ | 分子除以分母 | A/B 将得到 3.6 |
% | 余数运算符,整除后的余数 | B%A 将得到 3 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 19 |
– | 自减运算符,整数值减少 1 | A-- 将得到 17 |
变量自增自减有俩种写法
变量++ //表示自增+1后输出自增之前的值
++变量 //表示自增+1后输出自增之后的值
变量-- //表示自减-1后输出自减之前的值
--变量 //表示自减-1后输出自减之后的值
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a = 1;
int b1 = a++;
int b2 = ++a;
int c = 3;
int d1 = c--;
int d2 = --c;
printf("b1 = %d\n", b1);
printf("b2 = %d\n", b2);
printf("d1 = %d\n", d1);
printf("d2 = %d\n", d2);
system("pause");
return 0;
}
我来解释一下,b1 = a++,表示自增后输出自增之前的值,自增前a = 1。
b2 = ++a,表示自增后输出自增之后的值,由于b2之前b1已经自增一次了,所以到b2时,a自增了俩次,所以b2 = 3.
d1 = c--,表示自减后输出自减之前的值,自减前c = 3,所以d1 = 3。
d2 = --c,表示自减后输出自减之后的值,由于d2之前d1已经自减一次了,到d2时,c自减了俩次,所以d2 = 1。
关系运算符与条件表达式
用于判断条件,决定程序流程
关系 | 数学中的表示 | C语言的表示 |
---|---|---|
小于 | < | < |
小于等于 | ≤ | <= |
大于 | > | > |
大于等于 | ≥ | >= |
等于 | = | == |
不等于 | ≠ | != |
C语言基本类型int,char,double,暂时认为char,int适用上表
注意
1,=为赋值运算符,和数学中的=不同,==才是判断俩数是否相等
逻辑运算符与条件表达式
在日常生活中,要想做出某个决定,往往要判断很多个条件
例如:判断一个女孩是否漂亮
大脑中的逻辑是这样的:年龄25-30岁 并且 身高165cm-175cm 并且 身材火辣并且(颜值漂亮 或者 颜值一般)。
if ( (年龄 >= 25) 并且 (年龄 <= 30) )
{
if ( (身高 >= 165) 并且 (身高 <= 175) )
{
if (身材 == 火辣)
{
if ( (颜值 == 漂亮) 或者 (颜值 == 一般) )
{
printf("超女选秀合格,送往后宫。\n");
}
}
}
}
逗号运算符与条件表达式
#include <stdio.h>
int main()
{
3, 4, 5;//这是一条语句
//把上面这条语句的值赋值给变量a
int a = (3, 4, 5);
printf("a=%d\n", a);
}
输出结果:a=5
因为a的值是整条语句的值,而整条语句的值是最后那个逗号后面的值
如果一个语句有多个逗号,则以最后一个逗号后面的表达式为返回值
条件运算符
三目运算符又叫三元运算符,条件运算符。由一个问号和冒号组成
表达式1?表达式2:表达式3
先执行表达式1,如果表达式1的结果如果为真,那么执行表达式2,并且这个整体的运算式的结果是表达式2的结果;如果表达式1的结果如果为假,执行表达式3,运算式的结果是表达式3的结果。
sizeof运算符
sizeof是C语言关键字,用于计算当前系统中,变量或数据类型占用字节内存数
用于数据类型
sizeof(数据类型)
int ret = sizeof(int);
printf("整型变量占用内存 = %d\n",ret);
用于变量
int a;
printf("%d\n",sizeof(a));
sizeof(结构体)
理论上讲结构体的各个成员在内存中是连续存放的,和数组非常类似,但是,结构体占用内存的总大小不一定等于全部成员变量占用内存大小之和(结构体存在内存对齐)。在编译器的具体实现中,为了提高内存寻址的效率,各个成员之间可能会存在缝隙。用sizeof可以得到结构体占用内容在总大小,sizeof(结构体名)或sizeof(结构体变量名)都可以。
struct st_girl
{
char name[50]; // 姓名
int age; // 年龄
int height; // 身高,单位:厘米cm
char sc[30]; // 身材,火辣;普通;飞机场。
char yz[30]; // 颜值,漂亮;一般;歪瓜裂枣。
};
总大小为118,但输出为120.因为存在内存对齐,这个后面会提到
注意
1,不要对void类型使用sizeof
printf("sizeof(void)=%d\n",sizeof(void)); // 输出sizeof(void)=1
可能无法通过
因为void是空类型或无值型,不知道存储空间大小的类型,编译器也不能确定它的大小
2,不要再子函数中对字符指针用sizeof
如果把一个字符串(如char strname[21])的地址传给子函数,子函数用一个字符指针(如char *pstr)来存放传入的字符串的地址,如果在子函数中用sizeof(pstr),得到的不是字符串占用内存的字节数,而是字符指针变量占用内存的字节数(8字节或4字节)。
所以,不能在子函数中对传入的字符串进行初始化,除非字符串的长度也作为参数传入到了子函数中。
3,不要在子函数中对结构体指针使用sizeof
如果把一个结构体(如struct st_girl stgirl)的地址传给子函数,子函数用一个结构体指针(如struct st_girl *pgril)来存放传入的结构体的地址,如果在子函数中用sizeof(pgirl),得到的不是结构体占用内存的字节数,而是结构体指针变量占用内存的字节数(8字节)。正确的用法是用sizeof(struct st_girl)。
运算符优先级
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
() | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | -- | ||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |