int main()
{
int a = 0;
//~ 是按二进制位取反
//00000000000000000000000000000000 - 补码
//00000000000000000000000000000000 - 补码
//11111111111111111111111111111111 -> ~a
//11111111111111111111111111111110
//10000000000000000000000000000001
//-1
printf("%d\n", ~a);//-1
return 0;
}
运行结果为-1
int main()
{
int a = 3;
//int b = ++a;//前置++, 先++, 后使用
//a=a+1,b=a;
int b = a++;//后置++, 先使用, 再++
//b=a, a=a+1
printf("%d\n", a);//
printf("%d\n", b);//
return 0;
}
运行结果为4
3
int a = 10;
printf("%d\n", a--);//?
printf("%d\n", a);//?
return 0;
}
运行结果为10
9
int main()
{
int a = 10;
int* p = &a;
*p = 20;
printf("%d\n", a);
return 0;
}
运行结果为20
int main()
{
int a = 0;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//ok
//printf("%d\n", sizeof int);//err
return 0;
}
//sizeof是操作符, 不是函数
//strlen是库函数, 是用来求字符串长度
6.关系操作符
>
>=
<
<=
!= 用于测试“不相等”
== 用于测试“相等”
int main()
{
if (3 == 5)
{
}
//err
if ("abc" == "abcdef")//这样写是在比较2个字符串的首字符的地址
{
}
//两个字符串比较相等应该使用strcmp
return 0;
}
7.逻辑操作符
&& 逻辑与
|| 逻辑或
区分逻辑与和按位与
区分逻辑或和按位或
1&2----->0
1&&2----->1
1|2----->3
1||2----->1
int main()
{
int a = 3;
int b = 5;
int c = a && b;
printf("%d\n", c);
//if (a && b)
//{
//}
return 0;
}
例题://1. 能被4整除,并且不能被100整除
//2. 能被400整除是闰年
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
{
return 1;
}
else
{
return 0;
}
}
int main()
{
return 0;
}
#include <stdio.h>
int main()
{
int i = 0, a = 0, b = 2, c = 3, d = 4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\nb = %d\nc = %d\nd = %d\n", a, b, c, d);
return 0;
}
a = 1
b = 2
c = 3
d = 4
8.条件操作符(三目操作符)
表达式1?表达式2:表达式3
真 ✓ ×
假 × ✓
int main()
{
int a = 3;
int b = 0;
int max = (a > b ? a : b);
if (a > 5)
b = 3;
else
b = -3;
(a > 5) ? (b = 3) : (b = -3);
b = (a > 5 ? 3 : -3);
return 0;
}
9. 逗号表达式
exp1, exp2, exp3, ...expN
逗号表达式,就是用逗号隔开的多个表达式
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a = b + 10, a, b = a + 1);
printf("c=%d\n", c);
return 0;
}
运行结果为c=13
10.下标引用、函数调用和结构成员
(1) [] 下标引用操作符
操作数: 一个数组名 + 一个索引值
(2)( ) 函数调用操作符
接受一个或者多个操作数: 第一个操作数是函数名, 剩余的操作数就是传递给函数的参数。
(3)访问一个结构的成员
. 结构体.成员名
-> 结构体指针->成员名
// 下标引用相关代码
int main()
{
int arr[10] = { 0 };
// arr[7] --> *(arr+7) --> *(7+arr) --> 7[arr]
// arr是数组首元素的地址
// arr+7就是跳过7个元素, 指向了第8个元素
// *(arr+7) 就是第8个元素
//
arr[7] = 8;
7[arr] = 9;
//[] arr 7
//3 + 5;
//5 + 3;
return 0;
}
// 函数调用相关代码
//函数定义
int Add(int x, int y)
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
//函数调用
int c = Add(a, b);//() 就是函数调用操作符,操作数: Add,a,b
//
//sizeof a;
return 0;
}
// 结构成员相关代码
include <string.h>
struct Stu
{
char name[20];
int age;
double score;
};
void set_stu(struct Stu* ps)
{
strcpy((*ps).name, "zhangsan");
(*ps).age = 20;
(*ps).score = 100.0;
}
void print_stu(struct Stu ss)
{
printf("%s %d %lf\n", ss.name, ss.age, ss.score);
}
int main()
{
struct Stu s = {0};
set_stu(&s);
print_stu(s);
return 0;
}