数据类型,运算符,表达式

1、按照作用域范围,变量可以分为哪几种?

按照作用域范围,变量可以分为局部变量和全局变量。

局部变量

局部变量也称为内部变量,局部变量是在函数内作定义和说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。

关于其作用域还需要注意以下几点:

(1)主函数定义的变量也只能在主函数中使用,不能在其他函数中使用。(不同于其他语言)

(2)形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。

(3)允许在不同的函数中使用相同的变量名。

(4)在复合语句中也可以定义变量,其作用域只在复合语句范围内。

全局变量

全局变量也称为外部变量,它是在函数外部定义的变量,它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。全局变量的说明符为extern。

注意,如果同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量被“屏蔽”,即它不起作用。


2、基本内置类型有哪些?

(1)整型。又可分为int,short int,long,unsigned int,unsigned short int,unsigned long六种。

(2)实型。又分为float,double,long double三种。

(3)构造类型。又分为数组类型,结构类型,共用类型三种。

(4)指针类型。

(5)枚举类型。

(6)void类型。


3、const int *p;

int * const p;这两行代码有何区别?

const修辞*p,p所指向的空间里的值不变。

const修辞p,指针变量p里的值不变,也就是说p不能再指向其他地址,但是p所指向的空间里的值可变。


4、const struct devices dev[5];

struct devices consts * dev[5];有何区别?

const struct devices dev[5];中dev[5]数组里的值不变。

struct devices consts * dev[5];const修辞*dev[5],指针数组dev中每个元素指向的空间里的值不变。


5、C语言的运算符可分为哪几类?

C语言的运算符可分为以下几类:

(1).算术运算符用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。

(2).关系运算符用于比较运算。包括大于(>)、小于(<)、等于(==)、 大于等于(>=)、小于等于(<=)和不等于(!=)六种。

(3).逻辑运算符用于逻辑运算。包括与(&&)、或(||)、非(!)三种。

(4).位操作运算符 ,包括位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>).



6、C语言中关键字static、extern和auto的作用总结

(1)首先说一下auto自动存储类型,一般我们很少在程序中显示申明变量为auto类型。因为代码块中的变量缺省情况下就是这种类型,这种类型的变量存放于堆栈中,也就是说只有程序执行这些代码块(一对{}之间的语句)时这种自动变量才会被创建,代码块执行结束后自动变量便被释放。
(2)static关键字是我们在程序中经常使用的,static关键字的用法比较复杂,当用于不同上下文环境时,static关键词具有不同的含义。
当static关键字用于函数定义或者是用于代码块之外的变量申明时,static关键字是用来修改标识符的链接属性,将标识符的链接属性从external修改为internal,标识符的存储类型和作用域不会改变。申明为这种类型的变量和函数只能在源文件内被访问。
当static关键字用于代码块内部的变量申明时,static关键字用来修改变量的存储类型,将变量的存储类型从自动变量修改为静态变量,静态变量和自动变量的区别在于静态变量在代码块执行前就已经创建,并且在整个程序运行期间一直存在并不会在代码块执行后被释放。虽然静态变量一直存在单它不能被其他函数所应用。
(3)extern关键字的作用指定一个函数或者变量的链接属性,指定extern链接属性的标识符可以访问在其他任何位置定义的这个实体。


7、c语言中typedef的几种用法

(1)常规变量类型定义
例如:typedef unsigned char uchar 
描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明
(2)数组类型定义 
例如: typedef int array[2]; 
描述: array等价于 int [2]定义; array a声明等价于int a[2]声明
扩展: typedef int array[M][N]; 
描述: array等价于 int [M][N]定义; array a声明等价于int a[M][N]声明
(3)指针类型定义 
例如: typedef int *pointer; 
描述: pointer等价于 int *定义;pointer p声明等价于int *a声明
例如: typedef int *pointer[M]; 
描述: pointer等价于 int *[M]定义 pointer p声明等价于int *a[M]声明明
(4)函数地址说明 
描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址 
例如: 函数:int func(void); unsigned long funcAddr=(unsigned long)func, funcAddr的值是func函数的首地址
(5)函数声明 
例如: typedef int func(void); func等价于 int (void)类型函数 
描述1: func f声明等价于 int f(void)声明,用于文件的函数声明 
描述2: func *pf声明等价于 int (*pf)(void)声明,用于函数指针的生命,见下一条
(6)函数指针 
例如: typedef int (*func)(void) 
描述: func等价于int (*)(void)类型 
func pf等价于int (*pf)(void)声明,pf是一个函数指针变量


8、自增自减运算符需要注意的地方

(1) 自增运算符和自减运算符只能用于变量,而不能用于常亮或表达式,如5++或(a+b)++都是不合法的。应为5是常量,常量的值不能改变。(a+b)++也不可能实现,假如a+b的值为5,那么自增后得到的6放到什么地方呢?无变量可供存放!
(2)  ++ 和—的结合方向是“自右向左”(可以参考C语言运算符和结合性表)。一般情况下算数运算符的结合方向为“自左向右”,如果有-i++,i的左面是负号运算符,右面是自加运算符。如果i的原值等于3,若按照左结合性,相当于(-i)++,而(-i)++是不合法的,应为对表达式不能进行自加自减运算。
如果有printf(“%d”,-i++);,则先取出i的值3,输出-i的值-3,然后i增加为4。
注意-(i++)是先用i的原值3加上负号输出-3,再对i加1,不要认为先加完1后再加负号,输出-4,这是不对的。
(3)  自增(减)运算符常用于循环语句中,使循环变量自动加1;也用于指针变量,使指针变量指向下一个内存地址。


9、位运算的分类

(1) 按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
例如:9&5可写算式如下: 00001001 (9的二进制补码)&00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&5=1。

按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 运算 ( 255 的二进制数为0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
(2)按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
例如:9|5可写算式如下: 00001001|00000101
00001101 (十进制为13)可见9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d/nb=%d/nc=%d/n",a,b,c);
}
(3)按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)
main(){
int a=9;
a=a^15;
printf("a=%d/n",a);
}
(4)求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110
(5)左移运算 左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。
(6)右移运算 右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定


10、结构和联合的区别

(1) 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员, 而结构的所有成员都存在。 

(2) 对于联合的不同成员赋值, 将会对其它成员重写,  原来成员的值就不存 在了, 而对于结构的不同成员赋值是互不影响的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值