int main()
{
int i;
(i=1,i=10)?i++||++i:++i;
printf("%d",i);
getchar();
}
答案:11.
解释:逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为表达式1,表达式2,表达式3……表达式n
求解过程是:先求解表达式1,再求解表达式2,...。整个逗号表达式的值是最后一个表达式n的值。
然后就是关于"||"运算符的问题,方向从左到右,逻辑运算符有很重要的一个特性就是,如果左边的表达式可以决定整个表达式,那么后面就不会再计算。
比如本题中i++返回值为10,为真,那么||整个表达式为真,后面的++i不会再执行,所以整个结果为11
2、类A为抽象类,下列哪个是正确的:
A、A fun(int);
B、A* p;
C、int fun(A);
D、A obj;
答案:B
3、请描述windows下的内存管理方式。
4、iteearator与指针的区别。
答案:游标是指针,但不仅仅是指针。游标和指针很像,功能很像指针,但是实际上,游标是通过重载一元的”*”和”->”来从容器中间接地返回一个值。将这些值存储在容器中并不是一个好主意,因为每当一个新值添加到容器中或者有一个值从容器中删除,这些值就会失效。在某种程度上,游标可以看作是句柄(handle)。通常情况下游标(iterator)的类型可以有所变化,这样容器也会有几种不同方式的转变:对于除了vector以外的其他任何容器,你可以通过这种游标在一次操作中在容器中朝向前的方向走一步。这意味着对于这种游标你只能使用“++”操作符。而不能使用“--”或“+=”操作符。而对于vector这一种容器,你可以使用“+=”、“—”、“++”、“-=”中的任何一种操作符和“<”、“<=”、“>”、“>=”、“==”、“!=”等比较运算符。
5、请解释volatile的含义与用法。
答案:volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,如果这个变量由别的程序更新了的话,将出现不一致的现象。
6、UDP与TCP的区别。
答案:(TCP)传输控制协议,是一种提供可靠数据传输的通用协议。
(UDP)用户数据报协议,是一个面向无连接的协议。采用该协议不需要两个应用程序先建立连接。UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性差。
7、请实现一个MyVector类,并说明实现要点。
#include <iostream>
#include <new>
using namespace std;
template <class T>
class Iterator
{
public:
Iterator()
: m_pData(NULL)//, m_nPos(0)
, m_nSize(0), m_nLen(0)
{
}
virtual ~Iterator()
{
if (NULL != m_pData)
{
delete[] m_pData;
m_pData = NULL;
}
}
public:
virtual T* begin() = 0;
virtual T* end() = 0;
protected:
// int m_nPos;
int m_nSize;
int m_nLen;
T *m_pData;
};
template <class T>
class CMyVector : public Iterator<T>
{
public:
typedef T* iterator;
public:
CMyVector(int nSize = 10)
{
if (nSize <= 0)
{
nSize = 10;
}
m_nSize = nSize;
m_pData = new T[m_nSize];
}
~CMyVector()
{
}
public:
int Length() const
{
return m_nLen;
}
bool push_back(T obj)
{
if (m_nLen >= m_nSize)
{
//get more memory
int nSize = m_nSize * 2 + 1;
T *pTemp = new(nothrow) T[nSize];
if (!pTemp)
{
return false;
}
// memset(pTemp, 0, sizeof(T) * m_nSize);
memcpy(pTemp, m_pData, sizeof(T) * m_nLen);
delete []m_pData;
m_pData = pTemp;
m_nSize = nSize;
}
memcpy(m_pData + m_nLen, &obj, sizeof(obj));
m_nLen++;
return true;
}
public:
virtual T* end()
{
return m_pData + m_nLen;
}
virtual T* begin()
{
// m_nPos = 0;
return m_pData;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CMyVector<int> vtData;
CMyVector<int>::iterator it;
for (int i = 0; i < 30; i++)
{
vtData.push_back(i);
//cout << "nLen = " << vtData.Length() << endl;
}
cout << "vector data: " << endl;
for (it = vtData.begin(); it != vtData.end(); it++)
{
cout << *it << "\t";
}
cout << endl;
return 0;
}