#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
++ -- 操作符
int main()
{
int a = 10;
int b = ++a;//前置++,先++,后使用
int c = a++;//后置++,先使用,后++
printf("a=%d b=%d c = %d\n", a, b, c);//12 11 11
return 0;
}
int main()
{
int a = 10;
int b = --a;//前置++,先++,后使用
int c = a--;//后置++,先使用,后++
printf("a=%d b=%d c = %d\n", a, b, c);//8 9 9
return 0;
}
解引用操作符*
int main()
{
int a = 10;
&a;
int* pa = &a;
int *px = &*pa;//与上面一样
*pa;//解引用操作符,通过pa的地址找到a
printf("%p\n", pa);
return 0;
}
***(放类型) 强制类型转化
int main()
{
int a = 3.14;
int b = (int)3.14;
printf("%d %d\n", a, b);//3 3
return 0;
}
void test1(int arr[])//传首元素地址
{
printf("%d\n", sizeof(arr));//4 地址编号的大小
}
void test2(char ch[])//传首元素地址
{
printf("%d\n", sizeof(ch));//4 地址编号的大小
}
int main()
{
int arr[10] = { 0 };
char ch[10] = { 0 };
printf("%d\n", sizeof(arr));//40
printf("%d\n", sizeof(ch));//10
test1(arr);
test2(ch);
return 0;
}
***关系操作符
比大小的
== "相等"
***逻辑操作符
&& || (关注真假)
按位与 & (关注二进制位)
按位或 | (关注二进制位)
int main()
{
int age = 15;
if (age > 0 && age < 18)
{
printf("未成年\n");
}
int month = 0;
if (month < 1 || month>12)
{
printf("输入错误\n");
}
return 0;
}
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;//a++进行,a是0,表达式结束
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);//1 2 3 4
return 0;
}
int main()
{
int i = 0, a = 1, b = 2, c = 3, d = 4;
i = a++ || ++b || d++;//a++进行,a是0,表达式结束
printf("a=%d\nb=%d\nc=%d\nd=%d\n", a, b, c, d);//2 2 3 4
return 0;
}
***条件操作符
三目操作符
表达式 1 ? 表达式2 :表达式3
表达式1为真执行表达式2,为假执行表达式3;
int main()
{
int a = 10;
int b = 20;
int max = 0;
max = a > b ? a : b;
return 0;
}
***逗号表达式
int main()
{
int a = 3;
int b = 5;
int c = 6;
int d = (a += 2, b = a - c, c = a + 2 * b);//等于最后一个表达式的结果
printf("%d\n", d);
return 0;
}
***下标引用操作符
[]
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
printf("%d\n", arr[7]);
return 0;
}
***函数调用操作符
()
void test()
{
printf("hehe\n");
}
int main()
{
test();
return 0;
}
***访问一个结构体成员
. ->
结构体变量.结构体成员
结构体指针->结构体成员
struct Stu
{
char name[20];
int age;
double score;
};
int main()
{
struct Stu s = { "zs",20,85.5 };
printf("%s %d %.1lf\n", s.name, s.age, s.score);
struct Stu* ps = &s;//结构体指针
printf("%s %d %.1lf\n", (*ps).name, (*ps).age, (*ps).score);
printf("%s %d %.1lf\n", ps->name, ps->age, ps->score);
return 0;
}
***表达式求值
隐式类型转换
char short
整型提升:表达式中的字符和短整型操作数在使用之前被转换为普通整形
int main()
{
char a = 5;
//00000000000000000000000000000101
//a只能存1个字节00000101(截断)
char b = 126;
//00000000000000000000000001111110
//b存011111110
char c = a + b;
//a + b发生整形提升(补符号位)
//00000000000000000000000000000101 a
//00000000000000000000000001111110 b
//00000000000000000000000010000011 c
//10000011 c(截断)
printf("%d\n", c);//-125
//%d打印整数 ,发生整形提升
//11111111111111111111111110000011 补码
//11111111111111111111111110000010 反码
//10000000000000000000000001111101 原码
return 0;
}
***算术转换
int ,long ,long long ,float ,double
int main()
{
int a = 3;
float f = 5.5;
float r = a + f;//算术转换
//int -> float
return 0;
}
int main()
{
int a = 10;
int b = 20;
a + b;//表达式有两个属性:30 值属性,int 类型属性
return 0;
}
int main()
{
short s = 20;
int a = 5;
printf("%d\n", sizeof(s = a + 4));//2
printf("%d\n", s);//20 sizeof(表达式不真实计算)
return 0;
}
操作符的属性
1.操作符优先级
2.操作符的结合性
3.是否控制求值顺序
int main()
{
int a = 10;
int b = 20;
int c = a + b * 10;//优先级*
int d = a + b + 10;//结合性(查表)
return 0;
}