#include<iostream>
using namespace std;
int main() {
	int i=0,j=0;
	if((++i>0) ||(++j>0))
		cout<<i<<" "<<j; 
	return 0;
}

输出结果:1 0

分析:||短路原则,前面真后面就不用执行。 如果是&&前面为真后面才执行。


2、假定TT为一个类,则该类的拷贝构造函数的声明语句: TT(TT &x);


3、C结构体之位域(位段) 点击打开链接

#include<iostream>
using namespace std;
struct s
{
	int x: 3;
	int y: 4;
	int z: 5;
	double a;
};
int main() {
	cout<<sizeof(s)<<endl;
	return 0;
}


求sizeof(s)的结果为 16.

分析:看清楚结构体中是位操作,三个变量共占用一个int 类型的大小,int 类型占用4个字节,double占用8个字节,为实现内存对齐,int类型需要填充4个字节的长度。

x,y,z分别占用3,4,5位,int是4个字节32位,相当于xyz占用4个字节,double占8个字节,按照对齐原则,前面补4位,4+4+8=16.有一个条件是默认8字节对齐,如果前面加上一句#pragma pack(4)//设定为4字节对齐,结果就是12.

4、windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为:1、

#include<iostream>
using namespace std;
class A
{
};
int main() {
	cout<<sizeof(A)<<endl;
	return 0;
}


分析:C++对空类或者空结构体,对其sizeof操作时候,默认都是1个字节。如果类为空,结果是1.

#include<iostream>
using namespace std;
class A
{
	char b[0];
};
int main() {
	cout<<sizeof(A)<<endl;
	return 0;
}


如果在类中定义了变量,那就是变量size,char b[0]长为0,所以大小为0


类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二地址。同样空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就会有独一无二地址。所以空类的sizeof为1,而不是0.多重继承的空类大小也是1.


5、C语言用 非零整数值表示逻辑“真”。

    bool型的“true”在C++中才有的。


6、采用多路复用I/O监听3个套接字的数据时,如果套接字描述符分别是:5,17,19.则

select(int maxfd,struct fd_set* rdset,NULL,NULL)中的maxfd应取为:20.

分析:maxfd是三个套接字描述符中最大数字加1.



select函数头文件:
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>

select函数原型:
int select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
详细信息可查看 man select
select()函数的参数说明:
numfds 是readfds,writefds,exceptfds 中fd 集合中文件描述符中最大的数字加上1。
readfds 中的fd 集合将由select 来监视是否可以读取。
writefds 中的fds 集合将由select 来监视是否可以写入。
exceptfds 中的fds 集合将由select 来监视是否有例外发生。
timeout 是用来设置等待超时的
返回值:
如果成功,则返回就绪的文件描述符的数量。超时一般返回0。错误返回-1。

具体内容详见《

select - I/O多路复用

点击打开链接

7、

#include<iostream>
using namespace std;
int main(int argc,char **argv) {
	cout<<"wlcome to sogou!"<<endl;
	return 0;
}

程序运行正常。


8、在64位机器中,如下代码的输出是8 23;如果是32位机器,如下的代码输出是4 23.

#include<iostream>
using namespace std;
char acWelcome[]="Welcome to huawei Test";
void example(char acWelcome[]) {
	printf("%d",sizeof(acWelcome));
	return ;
}
int main() {
	example(acWelcome);
	cout<<endl;
	cout<<sizeof(acWelcome)<<endl;
	return 0;
}

分析:数组作为函数的参数是会退化为函数指针的,数组作为函数参数的时候常需要传递数组大小。

指针实质上是一个内存地址,内存地址的长度跟CPU的寻址有关。在32位系统上,CPU用32位表示一个内存地址,这样的系统上一个指针占据4个字节。在64位操作系统上,CPU用64位表示一个内存地址,这样的系统上一个指针占据8个字节。


9、栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将 提示overflow。因此,能从栈获得的空间较小。    
 

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储 的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小  受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 


补充:

在C/C++中,内存一般分为,堆区,栈区,全局区,文字长量区,程序代码区在函数中定义的局部变量是存在在栈区(除static局部变量,他是存在在全局区),动态生成的变量存在在堆区,由指针进行读写的全局变量,静态全局变量,静态局部变量是存放在全局区的。

堆是程序员进行申请和释放的,因此堆是向上,也就是向高地址方向的。栈是系统进行释放的,且栈区大小一般是定的2M,因此栈是向下,也就是向底地址方向。

另外说下,静态局部变量,静态全局变量和全局变量的区别,静态变量没有初始化时,系统会给默认值,而全局变量不会;全局变量在整个工程中都是可见的,而静态全局变量只在本文件中可见,静态局部变量只在此函数内部可见,但函数结束后不释放!


堆栈都有可能逃逸 逃逸分析----在计算机语言编译器语言优化管理中,分析指针动态范围的方法称之为逃逸分析(通俗点讲,当一个对象的指针被多个方法或线程引用时)---我们称这个指针发生了逃逸 例如一个方法中的临时变量引用,我赋值给了全局变量,就从栈里逃逸了