C/C++中的玄机

1、&& 例如 a&&b

先判定a是否为真,如果a为真,则判定b;如果a为假,则直接返回0


2、*(ptr++) 与 *ptr++ 相同,都是先取指针,再相加。++的优先级比*的优先级要高,()的优先级最高,但此处反常。


3、 地址符强制类型转换 

<span style="white-space:pre">	</span>float m = 1.5f;
	cout << "addr:"<< &m <<endl;
	cout << "float Addr:"<< (float &)m <<endl;
	cout << "int Addr:" << (int &)m << endl;
输出为 

4、不同类型之间运算原则:

(1)类型总是被提升为较宽的类型

(2)所有小于整形的有序类型算术表达式在计算之前会被转换成整形。


5、运算符优先级 

(1) 括号>单目>大于双目>大于三目

  (2)算术运算>逻辑运算

(3)移位 > 算术比较 > 逻辑比较 > 逻辑位运算 > 与或非 


6、判定X是否2的N次方 !(X&(X-1))


7、不用中间变量交换a,b

a = a^b;
b = a^b;
a = a^b;

8、不用比较语句求a,b中较大的数

max = (a+b +abs(a-b))/2;

9、求a,b两个数和的一半
half = (a+b)/2
half = (a&b) + ((a^b)>>1)

10、数组的偏移   int a[10] = {1,2,3,4,5,6,7,8,9,10};
 &a+1  这里偏移了一个数组长度的大小    相当于 a的地址 + sizeof(a)*4

 &(a+1) 表示向后偏移一个int 大小


11、const修饰的情况:

int b = 500;
const int* a = &b;
int const *a = &b;

int* const a = &b;
const int* const a = &b;

const 与 * 之间的修饰关系,右侧的修饰左侧的。  

1,2种情况,* 位于const 右侧,这是指针指向常量,指针可变,指针所指的值是不可变的。

3  const位于 * 的右侧,是const 修饰*。 指针为常量指针,生成时必须初始化所指对象。

4 是常量指针指向一个常量,生成时候也必须初始化所值对象。


12、static 与const 函数

static函数的特性: 1、不能申明为const函数;2、static函数中没有this指针;3、不能为虚函数;4、只能访问staitc成员变量,不能访问非static的成员变量

const函数的特性: 1、const函数中的this指针是常量指针,不能修改;2、const函数只能调用const函数以及static函数,非const函数可以调用成员函数以及const函数;3、const函数不能修改对象的成员变量,无论是否为const成员变量,但可以修改static成员变量;4、加上mutable的数据成员,在任何时候都可以被修改,可以在const函数中修改成员。


13、C++中 ,构造函数的列表初始化的顺序与成员的申明顺序相同,与列表初始化的顺序不一致。


14、常量数据类型不能在类中初始化,因此下面的申明有误。常量数据类型应该在构造函数列表中初始化,或者改为静态常量数据类型。

class A{
 const int size = 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值