C语言复习2

**变量的一般形式:**
	<存储类型> <数据类型> <变量名>;
	初始化: 在变量定义时就赋初始值
	赋值:   在定义之后再去给变量一个值
	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
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值