/*
*操作符练习 操作符的优先级和结合性练习
*/
#include <stdio.h>
int num3 = 0;//这里安排这个变量,意图在于测试语句num2 = num3++ + ++num3;
main()
{
int num = 0, num2 = 0;
num = (3, 7);
printf("num是%d\n", num);
//num++;
//++num;
//num--;
--num;
printf("num是%d\n", num);
//num2 = ++num;//前置加加操作符优先级非常高,基本上属于最高(优先级只低于 () [] -> 和 .)
num2 = num++;//后置加加操作符
printf("num是%d, num2是%d\n", num, num2);//num是7 num2是6
num2 = num++ + ++num;/*不要这么写语句,这样的语句具体执行结果依靠编译器,不同编译器编译时处理方式不一。 例如:num在局部变量和全局变量两种情况下是不同编译器处理方式就不一样*/
printf("num是%d, num2是%d\n", num, num2);//num是9 num2是16
num3 = 7;
num2 = num3++ + ++num3;/*num3为全局变量。同样的语句当num3为局部变量时候,运算结果可能就不一样,这取决于编译器在这种情况下的处理方案*/
printf("num2是%d, num3是%d\n", num2, num3);//num2是16 num3是9
}
/*
* 逻辑操作符练习
* 重点掌握操作符的结合性和优先级
* 逻辑运算是指计算结果只有真假两种结果的运算。
* 逻辑运算操作符:== > < >= <= !=
* 逻辑非(!) 逻辑与(&&) 逻辑或(||)
* 按位求反(~) 按位与AND(&) 按位或OR(|) 按位异或XOR(^)
* C语言中任何数据信息,都可以参与逻辑运算。规则:只有零才是假,其他都是真
* */
#include <stdio.h>
main()
{
int num = 0;
printf("3 == 5是%d\n", 3 == 5);
printf("3 != 5是%d\n", 3 != 5);
printf("3 < 5是%d\n", 3 < 5);
printf("3 > 5是%d\n", 3 > 5);
printf("3 >= 5是%d\n", 3 >= 5);
printf("3 <= 5是%d\n", 3 <= 5);
printf("3 < 7 < 5是%d\n", 3 < 7 < 5);//操作符<的结合性是"自左而右" 逻辑表达式3 < 7 < 5计算结果是1
printf("3 < 7 && 7 < 5是%d\n", 3 < 7 && 7 < 5);
printf("3 < 7 || 7 < 5是%d\n", 3 < 7 || 7 < 5);
/*请理解这条语句 3 > 5 && ++num;*/
3 > 5 && ++num;//计算机中逻辑运算(逻辑与和逻辑或)存在短路特性。当已经判定逻辑表达式运算结果,那么不管逻辑表达式是否全部判定结束都停止判定。
printf("num是%d\n", num);//num的打印结果是0
3 < 5 || ++num;//逻辑或的短路特性
printf("num是%d\n", num);//num的打印结果依然是0
printf("!6是%d\n", !6);
printf("3 + 5 >= 1是%d\n", 3 + 5 >= 1);//双目操作符+ -优先级高于逻辑操作符>=
return 0;
}
/*
* 位运算。位运算操作符:
* 按位取反(~)
* 按位与AND(&)
* 按位或OR(|)
* 按位异或XOR(^)
*
* 左移<<
* 右移>>
* */
#include <stdio.h>
main()
{
printf("3 & 5是%d\n", 3 & 5);
printf("0x0003 & 0x0005是%x\n", 0x0003 & 0x0005);
/*通常可以用按位与运算把某个机器数中特定的位清零*/
printf("0x00FE & 0x00C9 是%X\n", 0x00FE & 0x00C9);//表达式0xFE & 0xC9实现了把特定位(第2.3.5.6位)置零
printf("3 | 5是%d\n", 3 | 5);
printf("0x0003 | 0x0005是%X\n", 0x0003 | 0x0005);//表达式0x0003 | 0x0005实现了把特定位(第1.3位)置1
printf("3 ^ 5是%d\n", 3 ^ 5);
printf("0x005A ^ 0x0026是%X\n", 0x005A ^ 0x0026);//表达式0x005A ^ 0x0026实现把特定位(第2.3.6位)求反
printf("0x005A相反数是%X\n", (0x005A ^ 0xFFFF) + 1);//用按位异或XOR巧妙地获得了0x005A的相反数
printf("~0xffff是%X\n", ~0xffff);
printf("0xffffffff<<2是%X\n", 0xffffffff<<2);
printf("2<<1是%d\n", 2<<1);//左移会给右边补零,左移一位数值扩大2倍
printf("0x00000002<<1是0x%X\n", 0x00000002<<1);
printf("0xffffffff>>2是%X\n", 0xffffffff>>2);//对于源程序中出现的整型常量,编译器默认会将其认定为unsigned int型
printf("2>>1是%d\n", 2>>1);//对于无符号类型数据,右移会给左边补零,对于有符号类型数据,右移会给左边补符号位,右移一位数值缩小1/2倍
printf("0x00000002>>1是0x%X\n", 0x00000002>>1);
}
/*
* 隐式类型转换练习
* */
#include <stdio.h>
main()
{
int num = -10;
unsigned int num2 = 3;
num = (num + num2) > 0 ? 1 : -1;//隐身类型转换原则:把占有空间小的调整为占有空间大的,如果占有空间一样,则把有符号的数据转换为无符号数据
printf("(num + num2) > 0 ? 1 : -1 是%d\n", num);//num是1
printf("3 > 4 ? 1 : 0.9占有的存储空间是%d\n", sizeof(3 > 4 ? 1 : 0.9));
}
/*
* 强制类型转换
* */
#include <stdio.h>
main()
{
int num = 300;
printf("num是%d,地址是0x%p\n", num, &num);
printf("num是%d,地址是0x%p\n", (unsigned char) num, & num);
printf("num是%d,地址是0x%p\n", num, &num);
}