您的位置:首页 > 其它

数据类型、运算符、表达式常见问题

2018-01-24 21:21 246 查看
1.定义与声明的区别

定义和声明的根本区别是内存。

定义创建对象,并为这个对象分配了内存;而声明只是将与内存关联的对象名进行外域可见性的扩充,看不到,可以继续声明。

2.typedef和#define的区别

#define是预处理指令,不会参与编译过程,只是在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译被展开的源程序时才会发现可能的错误并报错。例如,#define PI 3.14 然后程序中计算C=2*PI*r。如果把#define语句中的数字1换成字母l,预处理夜照样可以带入。typedef是在编译时处理的。

3.局部变量与全局变量的区别

局部变量也称为内部变量,局部变量是在函数内作定义说明的,其作用域仅限于函数内,离开该函数后再使用这种变量是非法的;全局变量也称外部变量,它是在函数外部定义的量,它不属于哪一个函数,它属于一个源程序文件,其作用域是整个源程序。

4.容易出错的运算符优先级问题

同一优先级的运算符,运算次序由结合方向所决定。

即 !>算术运算符>关系运算符>&&>||>赋值运算符

.的优先级高于*;[]高于*;函数()高于*;==和!=高于位操作;==和!=高于赋值符;算数运算符高于移位运算符;逗号运算符在所有运算符中优先级最低。

5.static用法

(1)修饰局部变量

(2)修饰函数和全局变量

局部变量按照存储形式来分,分为auto,static,register

首先从内存的角度去看,auto即为普通的局部变量,存储在栈上,当函数结束时,随之释放。register为寄存器变量,存放在寄存器里面,调用速度快。在C语言中register变量不能取地址,会报错。

static修饰局部变量时该变量是存放在静态存储区,生命周期是整个程序结束。

static局部变量初次定义时就要初始化,且只能初始化一次。如果在定义的时候没有初始化,编译器就会自动赋值为0(也就是说如果重复调用同一个函数,在第二次调用时,就不会再执行static局部变量初始化了)。

当static修饰全局变量或者函数时,不是为了限制其存储方式,而主要是为了限制该全局变量或者函数的作用域仅限于本文件,所以又称为内部函数。此时,对于外部(全局)变量, 不论是否有static限制,它的存储区域都是在静态存储区,生存期都是全局的。此时的static只是起作用域限制作用,限定作用域在本模块内部。

使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

6.什么是变量

其值在其作用域内可以改变的量称为变量。一个变量应该有一个名字,在内存中占据一定的存储空间。变量在使用前必须要定义,每个变量都有自己的地址。变量依据其定义的类型,分为不同类型,如整型、字符型、浮点性、指针型等。变量的值可以发生改变,意味着它可以被覆盖、被写入、被赋值。每个变量必须要有一个名字和它所在内存空间绑定。

7.枚举与#define宏的区别

(1)#define宏常量是在预编译阶段进行简单替换,枚举常常则是在编译的时候确定其值。

(2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

(3)枚举可以一次定义大量相关的常量,而#define宏一次只能定义一个。

8.什么是常量

常量是常数或代表固定不变值得名字。注意变量名不能放在赋值语句的左边。

关于#define,在c中,#define pi 3.1415926这条指令的格式是#define后面跟一个常量名再跟一串字符,中间用空格隔开,由于它不是C++语句,所以行末不用分号。

整型常量,可以有3种表示方式:10进制整数,8进制整数(以0开头),16进制(以0x开头)。

实型常量,有两种表示:小数形式,指数形式(123e5 = 123×105)。

字符常量,使用单引号括起来的一个字符。在内存中,字符数据以ASCII码存储,即以整数表示,所以字符数据和整型数据之间可以相互赋值,只要注意其表示的范围合理。

字符串常量,是由一对双括号扣起来的字符序列。字符常量总是以‘/0’结束。注意不能将字符串常量赋给字符常量。“0”和‘0’是不同的。

枚举常量,可以通过枚举类型来定义。定义枚举类型的语法是先写关键字enum,后跟类型名,花括号,花括号括起来的里面是用逗号隔开的每个枚举常量值,最后以分号结束定义。

9.位运算

按位与运算符(&)

参加运算的两个数据,按二进制位进行“与”运算。

运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0. 另外,负数按补码形式参加按位与运算。

按位或运算符(|)

参加运算的两个对象,按二进制位进行“或”运算。

运算规则:0|0=0; 0|1=1; 1|0=1;  1|1=1;

即:参加运算的两个对象只要有一个为1,其值为1。另外,负数按补码形式参加按位或运算。

异或运算符(^)

参加运算的两个数据,按二进制位进行“异或”运算。

运算规则:0^0=0; 0^1=1; 1^0=1;  1^1=0;

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

左移运算符(<<)

将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

例:a = a<< 2将a的二进制位左移2位,右补0,

左移1位后a = a *2; 

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

右移运算符(>>)

将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

操作数每右移一位,相当于该数除以2。

例如:a = a>> 2 将a的二进制位右移2位,

左补0 或者补1得看被移数是正还是负。

10.++、--操作符

++、--作为前缀,先自加或自减,再进行别的运算;但是作为后缀时,例如

int x;

int i=3;

x=(++i,i++,i+10);

逗号表达式中,i在遇到每个逗号后,认为本计算单位已经结束,i这时候自加,所以,i的值为5,x的值为15.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: