Coding In C day05

/*
 *操作符练习 操作符的优先级和结合性练习
 */

#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);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C和C++的安全编码是指在编写C和C++代码时,采取一系列的措施来确保代码的安全性和防止常见的安全漏洞。由于C和C++是底层的编程语言,它们允许对内存直接进行操作,这也使得它们容易受到各种安全威胁的攻击。 在进行安全编码时,有几个关键的原则需要遵循。首先是验证输入。由于输入数据往往是来自外部,我们需要对输入进行验证,以确保它们符合预期的格式和范围。这样可以防止缓冲区溢出和格式化字符串漏洞等攻击。 其次,应该正确地管理内存。C和C++允许直接控制内存的分配和释放,但这也意味着需要手动管理内存的生命周期。如果没有正确地分配和释放内存,会导致内存泄漏和非法内存访问等问题。因此,务必要仔细检查并指定正确的内存操作。 此外,还应注意避免使用不安全的函数和功能。一些函数和功能可能存在安全风险,如strcpy和scanf等。应该使用更安全的替代函数,如strncpy和fgets等,以提高代码的安全性。 最后,代码的安全性也需要经过不断的测试和审查。通过进行静态代码分析和动态测试,可以发现和纠正代码中的潜在安全问题。此外,代码审查也是非常重要的,通过互相审查可以找到潜在的漏洞和错误。 总而言之,C和C++的安全编码需要遵循验证输入、正确管理内存、避免使用不安全函数和功能以及进行测试和审查等原则。只有通过采取适当的安全措施,才能确保代码的安全性并防止潜在的安全漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值