**变量的一般形式:**
<存储类型> <数据类型> <变量名>;
初始化: 在变量定义时就赋初始值
赋值: 在定义之后再去给变量一个值
int a;
a = 10; //赋值
int b = 20; //初始化
int a = 10, b = 20; //初始化
a = b; //赋值
int a = 10, b = a; //初始化
int b = a, a = 10; //错误, a未定义
强制数据类型的转换是指采用某种方式将某种数据类型强制转换成指定的数据类型。
这种转换存在两种方式:一种为显式的数据类型转换,另一种为隐式的数据类型转换。
显式的数据类型转换实现的一般形式为:
(数据类型名称)< 表达式 >
注意:在C语言中char和short在参与算术运算时都会自动变为int
char a = 'A'+2;
short b = a+2;
算术运算: + - * / % ++ –
C语言提供的加减乘除运算符如同数学的加减乘除一样,是对数值的运算。例如:
int a = 1 + 2;
这一行代码中,涉及到2个运算符:
(1) 加法运算符“+”,对1和2数值进行数学的加法操作;
(2) 赋值运算符“=”,是把 1+2 表达式的运算结果,就是表达式的值赋给变量a;
C语言中的除法运算有点奇怪,不同类型的除数和被除数会导致不同类型的运算结果:
当除数和被除数都是整数时,运算结果也是整数;如果不能整除,那么就直接丢掉小数部分,只保留整数部分,这跟将小数赋值给整数类型是一个道理。
一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
#include <stdio.h>
int main()
{
int a = 100;
int b = 12;
float c = 12.0;
double p = a / b;
double q = a / c;
printf("p=%lf, q=%lf\n", p, q);
return 0;
}
运算结果:
p=8.000000, q=8.333333
a 和 b 都是整数,a / b 的结果也是整数,所以赋值给 p 变量的也是一个整数,这个整数就是 8。
另外需要注意的一点是除数不能为 0,因为任何一个数字除以 0 都没有意义。
取余,也就是求余数,使用的运算符是 %。C语言中的取余运算只能针对整数,也就是说,% 的两边都必须是整数,不能出现小数,否则编译器会报错。
另外,余数可以是正数也可以是负数,由 % 左边的整数决定:
如果 % 左边是正数,那么余数也是正数;
如果 % 左边是负数,那么余数也是负数。
**逻辑运算符: ** && || !
&&:左右两个操作数都为真,结果为真,如果左右操作数有一个或都为假,结果一定为假
int a = 0, b = 1, c;
c = a++ && ++b;
printf("%d %d %d\n", a, b, c);//1 2 1
短路法则:
int a = 0, b = 1, c;
c = a && ++b;
printf("%d %d %d\n", a, b, c); //0 1 0
int a = 0, b = 1, c;
c = ++a && ++b;
printf("%d %d %d\n", a, b, c);//1 1 1
||:左右两个操作数都为假,结果为假,如果左右操作数有一个或都为真,结果一定为真
int a = 1, b = 1, c;
c = a || ++b;
printf("%d %d %d\n", a, b, c); //1 1 1
int a = 1, b = 1, c;
c = a-- || ++b;
printf("%d %d %d\n", a, b, c); //0 1 1
int a = 1, b = 1, c;
c = --a || ++b;
printf("%d %d %d\n", a, b, c); //0 2 1
!:操作数为真结果为假,操作数为假结果为真
int a = 0, c;
c = !a;
位运算:
& | ~ ^ << >>
&:位与,双目运算符,左右操作数按位进行与操作
char a = 0x10, b = 071, c;
c = a & b;
= 1 0000 & 11 1001
= 01 0000 & 11 1001
= 01 0000
= 0x10
|:位或,双目运算符,左右操作数按位进行或操作
char a = 20, b = 66, c;
c = a | b;
= 1 0100 | 1000010
= 001 0100 | 100 0010
= 101 0110
= 64+16+4+2
= 86
~:位反,单目运算符,把操作数按位取反
char a = 77, c;
c = ~a;
= ~(64+8+4+1)
= ~1001101
= 0110010
= 32+16+2
= 50
^:异或,双目运算符,左右操作数按位进行异或(相同为0不同为1)操作
char a = 14, b = 51, c;
c = a ^ b;
= 1110 ^ 110011
= 00 1110 ^ 11 0011
= 11 1101
= 32+16+8+4+1
= 61
(>>):右移,双目运算符,把左操作数向右移动右操作数这么多位
unsigned char a = 151, c;
c = a >> 3;
= (128+16+4+2+1) >> 3
= 1001 0111 >> 3
= 0001 0010
注意:
移位操作时,目标数据本身不会发生改变
有符号移位:
符号位不变,看目标数据的正负,
正数:
0111 1111 << 1 -> 0111 1110
0111 1111 >> 1 -> 0011 1111
负数:
1000 1111 << 1 -> 1001 1110
1000 1111 >> 1 -> 1100 0111