操作符和表达式
操作符
1.算数运算符
+ - * / %
注:1) / 运算中,被除数不能为零
2) % 运算中,浮点数不能用于取模
2.移位操作符
<< 左移操作符 左边抛弃,右边补零(左移一位相当于乘以2)
>> 右移操作符 ①算数右移:如果最高位为1,则补1,否则补0
②逻辑右移:高位补零,右边抛弃(相当于除以2)
注:负数不能进行移位操作符。
3.位操作符
| 按位或 (二进制每位对应去或)
& 按位与
~ 按位取反
^ 按位取异或
1)把一个整数的二进制中的某一位设置为1或0
int num = 10;
num = num | (1 << 4);//把第四位设置为1 0000 1010 --> 0001 1010
num = num & ~ (1 << 4);//把第四位设置为0
2)求一个整数存储在内存中的二进制中1的个数
法一
int num = -1;
int count = 0;
int i;
for(i = 0; i < 32; i++)
{
//右移32次 和1按位与
if(((num >> i) & 1) == 1)
{
count++;
}
}
printf("%d\n", count);
法二
int num = 15;
int count = 0;
while(num)
{
//循环没搞懂,反正能实现
//有看懂的帮我理解下
count++;
num = num & (num - 1);
}
printf("%d\n", count);
4.赋值操作符
+= -= /= *= %= |= &= ~= 先运算后赋值
i++ 后置++相当于,int t = i; i += 1; return t; 多占用内存
++i 前置++相当于,i += 1; return i; 不用另开辟内存保存变量, 多使用
5.单目运算符
! 逻辑取反 + - ++ --
& 取地址
~ 二进制数按位取反
* 解引用操作符
sizeof 操作数的类型长度(按字节)
sizeof求长度对于数组, 传参使隐式转为指针和类型的关系:
void test1(int* a)
{
printf("%d\n", sizeof(a));
}
void test2(char* ch)
{
printf("%d\n", sizeof(ch));
}
int main()
{
int a[10] = {0};
char ch[10];
printf("%d\n", sizeof(a));
//输出为40,sizeof(a)求整型数组的长度,4个字节的10个元素
printf("%d\n", sizeof(ch));
//输出为10,sizeof(ch)求字符数组的长度,1个字节的10元素
test1(a);
//输出为4,数组传参时,被隐式转换为指向数组首个元素的指针
test2(ch);
//不管int*还是char*指针类型长度都为4字节
return 0;
}
6.关系操作符
< > <= >=
== 判断相等
!= 判断不等
7.逻辑操作符
&& //逻辑与 1 && 2 为真(1)
|| //逻辑或 1 || 2 为真(1)
对于&&来说,如果左侧表达式为假,则后面表达式不在计算。
对于 || 来说,如果左侧表达式为真,则右侧表达式不在计算。
360面试真题
int i = 0, a = 0, b = 2, c = 3, d = 4;
//i = a++ && ++b && d++; //输出为 a = 1, b = 2, d = 4
//a++先赋值后加,所以i第一个数为假,逻辑表达式不在往后运行
i = a++ || ++b || d++; //输出为 a = 1, b = 3, d = 4
//a++先赋值后加,所以i第一个数为假,运算到第二个表达式++b为真,表达式不在运行
printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d);
8.条件操作符
exp1 ? exp2 : exp3
//三目运算符可实现else if 的功能
举例
(a > b) ? a : b
//相同功能代码为
if(a > b)
{
a;
}
else
{
b;
}
9.逗号表达式
表达式1,表达式2, ...... ,表达式n
逗号表达式的输出为: 从左向右 ,最后一个表达式
10.下标引用、函数调用和结构成员
1) 数组名 + [ ]下标引用 可调用数组或数组中的某个元素
2) 函数名 + ( )函数调用操作符 可调用函数
3).结构体.成员名
–>结构体–>成员名
结构体调用,使用举例
struct Stu
{
char name[10];
int age;
};
void person1(struct Stu stu)
{
strcpy(stu.name , "pipifei");//字符串赋值
stu.age = 18; //结构体成员调用
printf("%s %d\n", stu.name, stu.age);
}
void person2(struct Stu* P)
{
strcpy(P->name , "wangtengfei");
P->age = 25; //结构体成员调用
printf("%s %d\n", P->name, P->age);
}
int main()
{
struct Stu stu; //结构体名定义
struct Stu* Per = &stu;//结构体调用
person1(stu); //结构体传参1
person2(Per); //结构体传参2
}