操作符、关键字,及#define定义
操作符
算术运算符
? + - * / %
% 取模(求两个整数的余数) 例:5 % 2 = 1
移位操作符
? << >>
对二进制进行移位操作
如:<< 左移操作符
int a = 1;
int b = a << 2;
位操作符
& 按位与
^ 按位异或
| 按位或
int a = 3;
int b = 5;
int c = a&b;
int d = a|b;
int e = a^b;
赋值操作符
-
= 等号右边的值赋给等号左边的变量 ( == 判断左右两边是否相等,相等为真,不等为假) -
复合赋值符:*+= -= = /= <<= >>= &= |= ^= += a = a+1; 与 a += 1;完全等价 -= a = a-1; 与 a -= 1;完全等价 ……
单目操作符
- ! 逻辑反操作 :C语言中非0为真,0为假,逻辑反操作就是将真假颠倒。
int a = 3;
int b = -2;
int c = 0;
int d = !a;
int e = !b;
int f = !c;
-
- 取负值 -
+ 取正值 -
& 取地址 -
sizeof 操作数的类型长度(以字节为单位)
int main()
{
int a = 10;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof a);
printf("%d\n", sizeof(int));
int arr[10] = { 0 };
printf("%d\n", sizeof(arr));
int sz = sizeof(arr) / sizeof(arr[0]);
return 0;
}
int main()
{
int a = 1;
int b = ~a;
printf("%d", b);
return 0;
}
int a = 10;
int b = a--;
printf("%d\n", b);
printf("%d\n", a);
int b = ++a;
printf("%d\n", b);
printf("%d\n", a);
int a = 10;
int b = a++;
printf("%d\n", b);
printf("%d\n", a);
int b = ++a;
printf("%d\n", b);
printf("%d\n", a);
-
* 间接访问操作符(解引用操作符) -
(类型) 强制类型转换
int main()
{
int a = (int)3.14;
printf("%d\n", a);
float b = 5/4;
float c = (float)5/4;
printf("b=%f,c=%f",b,c);
return 0;
}
逻辑操作符
-
&& 逻辑与 (只有两侧全部为真时出1,否则出0)
int a = 1;
int b = 2;
int c = 0;
int d = 0;
int e = a && b;
int f = a && c;
int g = c && d;
printf("e=%d,f=%d,g=%d", e,f,g);
-
|| 逻辑或 (两侧至少有一个为真时出1,否则出0)
条件操作符
格式:exp1?exp2 : exp3 作用:若exp1为真,执行语句exp2;否则执行语句exp3
int main()
{
int a = 0;
int b = 3;
int max = 0;
max = a > b ? a : b;
printf("%d\n", max);
return 0;
}
逗号表达式
格式:exp1, exp2, exp3, …expN 作用:逗号表达式,是从左向右依次计算的,整个表达式的结果是最后一个表达式的结果
int main()
{
int a = 0;
int b = 3;
int c = 5;
int d = (a = b + 2, c = a - 4, b = c + 2);
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[5]);
return 0;
}
-
() 函数调用操作符:调用函数的时候,函数名后边的()就是函数调用操作符 -
. -
->
关键字
auto break case char const continue default do double else enum
extern float for goto if int long register return short signed
sizeof static struct switch typedef union unsigned void volatile while
typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名。
typedef unsigned int uint;
intmain()
{
unsigned int num1 = 0;
uint num2 = 0;
return0;
}
static
#include <stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0; for(i=0; i<5; i++)
{
test();
}
return 0;
}
#include <stdio.h>
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0; for(i=0; i<5; i++)
{
test();
}
return 0;
}
对比代码1和代码2的效果理解static修饰局部变量的意义。
结论:static修饰局部变量改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束, 生命周期才结束。
int g_val = 2018;
int main()
{
extern g_val;
printf("%d\n", g_val); return 0;
}
static int g_val = 2018;
int main()
{
extern g_val;
printf("%d\n", g_val);
return 0;
}
代码1正常,代码2在编译的时候会出现连接性错误。
结论:一个全局变量被static修饰,使得这个全局变量只能在本源文件内使用, 不能在其他源文件内使用。
int Add(int x, int y)
{
return x+y;
}
int main()
{
extern int Add(int,int);
printf("%d\n", Add(2, 3));
return 0;
}
static int Add(int x, int y)
{
return x+y;
}
int main()
{
extern int Add(int,int);
printf("%d\n", Add(2, 3));
return 0;
}
代码1正常,代码2在编译的时候会出现连接性错误.
结论:一个函数被static修饰,使得这个函数只能在本源文件内使用,不能在其他源文件内使用。
register
作用:建议将变量定义为寄存器变量,以提高该变量读取速度
register int a = 10;
#define定义常量和宏
#define定义标识符常量
#define MAX 1000
int main()
{
printf("%d\n", MAX);
return 0;
}
#define定义宏
#define ADD(X,Y) (X+Y)
int main()
{
printf("%d\n", 4*ADD(2, 3));
return 0;
}
|