二、C语言变量与运算符

(1)char(字符),unsigned char(无符号字符型),short(短整型),unsigned short(无符号短整型),int(整型),unsigned int(无符号整形),long(长整型),unsigned long(无符号长整型)都是C语言支持的数据类型,他们都用来表示不带小数点的整数。

 

(2)char的每个取值都是ASCII(读:阿斯可)字符表中的某个数字编号,而ASCII表中的每个数字编号和字符之间有着对应的关系。(如:十进制的48表示‘0’字符)。而且char数据没有明确规定符号,或正或负由各编译器规定,一般正规写法是(signed  char和unsigned  char)。

 

(3)字节(用KB表示)是计算机中用来表示空间大小的基本单位,所有的变量或数据类型所占用的内存空间大小一定是整数个字节。使用sizeof关键字可以在编译时候计算出某个数据空间的大小。

如: sizoef(int)值为4个字节。

 

(4)计算机的内存是由很多字节构成的,每个字节有一个独立的地址。每个变量的地址都是由其第一个字节的地址表示的(如,int a=0; a占4个字节,第一个字节的地址就是a的内存地址)。

 

(5)每个字节分成八段,即8位,每一位的取值只能是0或者1,这8位数据排成一行,最右边的一位叫做第0位(最低位),位数从右到左依次递增,最左边的一位是最高位。每一位都表示成二进制位,因此每一位对应的十进制数值都是2的位数次方(如若最低位为1,则表示位2的0次方)。因此,任何一个数字都能用一组连续不断的0或1的二进制位表示。

 

(6)二进制(Binary)数由一连串的0或1表示,每一位最大值为1,如010110101;

八进制(Octal)数由1到7的一连串数表示,每一位最大值为7,如0757或者\0343,以零开头或者杠零开头的数都会当做八进制数,('\'在零之前表示转义,将后面的零转换成八进制的意义,若没有一杠且后面的数字位都不大于7,也默认是八进制)。

十进制(Decimal)数直接由一连串阿拉伯数字表示。

十六进制(Hexadecimal),每一组4位的二进制位数都可以表示一位的十六进制数,不足4位的在高位补零,一般以开头'0x'表示十六进制数,如0xfaf212,其中每一位都是0到15的数值,而10到15用a、b、c、d、e、f表示(大写小写都行)。

 

(7)二进制转十进制:10101 = 16 + 0 + 4 + 0 + 0【(1乘以2的4次方)+(0乘以2的3次方)+(1乘以2的2次方)+(0乘以2的1次方)+(1乘以2的0次方)】

八进制转十进制:071054= 【(7乘以8的4次方)+(1乘以8的3次方)+(0乘以8的2次方)+(5乘以8的1次方)+(4乘以8的0次方)】

十六进制转十进制:0xf43ae = 【(15乘以16的4次方)+(4乘以16的3次方)+(3乘以16的2次方)+(10乘以16的1次方)+(14乘以16的0次方)】

(8)十进制转换其他进制:9=1001(二进制);33=041(八进制);65=0x41(十六进制);

正的十进制数转换规则:就是将十进制数不断地除以其他进制,取到每一步除法的余数依次从低位到高位排列,然后在数值前加上进制数的限定符号(八进制用'0'或'\0',十六进制用'0x')。

负的十进制数转换规则:先将相反数转换成二进制,然后对这个二进制数按位求反再加上1(按位求反就是全部位数由0变成1,1变成0)。转换成二进制之后再转换成其他进制数。

二进制转八进制规则:从低位到高位,每取三位数,将其转换十进制位来作为一位八进制数,若后面的高位不足三位数则在最高位将缺少的位数都补充为零。

二进制转十六进制:从低位到高位,每取四位数,将其转换成十进制,然后十进制转换为十六进制数作为一位十六进制数,若后面高位不足四位数,则在最高位将缺少的位数都补充为零。

注:进制之间的转换可以先把其他进制转换成十进制,然后再用十进制转换成其他进制。负的十进制位转换成其他位一般先转换成二进制数,然后用这个二进制数转换成其他进制数。

 

(9)计算机为每个变量分配了一个编号(又叫地址),不同变量的地址一定不一样。地址和变量名称都可以用来表示变量,但是地址的功能更强。变量的地址就是一个数字,这个数字人通常看不懂什么意思。地址数据和普通数据的使用方式完全不同。在变量名前边加上符号&可以获得变量的地址数据,在变量地址数据前边加上符号*可以表示变量。

 

(10)在c语言标准中,每个变量的名称都和类型名绑定,而变量名和内存地址一样,都能表示一段内存空间,但变量名具有类型标识,在编译器中预定义了该类型所占的内存大小,每定义一个类型的变量,编译器就会分配对应大小的内存大小。而内存地址只是一段内存中的某个字节地址,指向的位置并不清楚其是否可以读写,而且内存地址并没有类型,没有规定其内存大小。

如int a=0,编译器规定了a应该占4字节的内存,就不能多占用或少占用内存大小;而内存地址如0xffaf1120,编译器没有规定该地址占用多少字节的内存空间,其内存空间大小是不确定的。

 

程序员的本质是利用程序语言,通过程序语言可以和计算机内存、cpu等资源间接打交道,然后达到实现功能、项目或产品的目的!

C语言标准里,程序员可以通过声明定义变量,也可以通过内存地址来操纵内存。

变量的声明和定义很简单:

【类型名 + 一个或多个空格 + 变量名 + ';'】

【类型名 + 一个或多个空格 + 变量名 + 初始赋值 + ';'】

如: 【int a;】【int a=0;】

通过内存地址操纵内存使用的是指针(后面单独细讲),请注意指针就是内存地址!

指针可分为两种,一种是未指定类型的指针,另一种是指定类型的指针。(注:这里的指定类型和未指定类型,并不是指针本身的类型,而是其指向的内存地址所存储的数据类型,即若指针指向int类型的数据,那么就是指定类型的,若没有指定类型的,必定是不确定的指针,又称为野指针,是程序员不可以使用的指针!)

注:程序员要用好指针,必须掌握指针本身类型,和指针指向的数据类型,还有指针类型之间的强制性转换。如整形指针被强制性转换成浮点型指针!但不论指针如何转换,必须清楚其指向的内存地址究竟是哪种类型!

 

(11)在我们使用变量时候,或许会碰到两个类型不匹配的变量进行运算,如【int a= 9; float b = 10.89; a + b;】显然a和b不是同一种类型。所以需要类型之间的转换。

类型之间转换有两种:一种的显式转换,另一种是隐式转换。

显式的转换,很明显是指看得见的,明确的,转换的格式很简单:【(目的类型)需要被转换的变量或值】如int a = (int)10.34;把一个浮点数值显示强制转换成int类型。

隐式转换,就是隐藏在代码里面的转换,靠双眼是看不出来的,只能用逻辑去推测代码里面是怎么转换的。而且,隐式转换在C语言里有明确规定,从小转换到大,即为了转换之后不至于会出现数据丢失,所以都是占内存小的类型转换为占内存大的类型,但是如果运算目标类型比运算中的变量所占的内存要小,则可能会发生数据截断丢失,因为占内存大的变量要转换为占内存小的变量,必须截断掉多出来的高位数据位,以至于占内存小的变量能正常存储。

在这里,一般常量的带小数点的浮点数都会默认为double类型。

如short转换为int,float转换为double。

如:【float a = 10 + 20.34;】这里发生了两次转换,一次是因为参与运算的两个参数10和20.34的类型并不匹配,把10转换成20.34的double类型, 然后double和目标变量a的float类型不匹配,且从大容量转换到小容量,截断凸出来的高位,将低位赋值给a。

如:int myfunc() { return 1.23; } 这里在函数返回值返回时候发生类型转换,double类型的1.23返回,但函数返回值需要的只是int类型,所以会吧1.23的小数点都截断,返回了1。

 

(12)运算符分为单目、双目、三目运算符。

单目运算符表示只针对一个变量进行运算,如a++和&a,表示a的自增和取a的地址。

双目运算符表示针对两个变量进行的运算,如a+b和a*b,表示a和b的加法和乘法运算。

三目运算符表示对三个变量进行的运算,目前只有一个,也就是条件表达式(a?b:c),表示若a为真,则运算b,否则运算c;

 

每个运算符有优先级和运算顺序的区别,C语言有一套运算符列表(自己网上找找看),优先级越高的运算符越先运算,在优先级相同的运算符里,运算顺序就决定了其运算的先后。

如a+b*c+d,乘法运算符*比加法运算符+优先级更高,所以b和c的乘法先运算,之后的都是加法运算符,按照加法运算符的同类运算符从左到右的结合规则,先算a和b*c的加法,再和d算加法。

若要打破运算符优先级和运算结合规则,可以用小括号'()'来包含优先预算的语句。

 

逻辑运算符包括==(等于),!=(不等),>(大于),>=(大于等于),

<(小于),<=(小于等于),!(取反)

逻辑运算表达式的计算结果用0或1表示,0表示假,1表示

真。

在C语言里一个整数也可以当成逻辑运算表达式,整数0表示

假,其他整数表示真。

 

&&(与),||(或)可以把两个现有的逻辑表达式连接成一个。

 

位运算符直接对数据在内存中的二进制存储形式进行计算。

&(按位与),|(按位或),~(按位求反),^(按位异或),

<<(按位左移)和>>(按位右移)

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值