1、關于初始化:
deque<string> Deque;// 一個deque容器

deque<string> Deque2(Deque.begin(),Deque.end()); // 一種初始化

copy(Deque.begin(),Deque.end(),back_inserter(Deque2) ); // 一種初始化

deque<string> Deque3(istream_iterator<string>(cin),istream_iterator<string>()); // 一種初始化

現在討論第三種初始化方式,
typedef istream_iteraor<string> (Func)();

deque<string> Deque3(istream_iteraotr<string> cin, Func);
看上去像一個函數聲明,

typedef istream_iteraor<string> (Func)();
deque<string> f(stream_iteraor<string> ,Func);
現在比較清晰了吧,很像一個函數聲明了,

所以第三種初始化方式根本就不能做任何事情.

//如果真的要達到初始化的目標,可以通過括號來消除二義性
deque<string> Deque3( (istream_iterator<string> (cin)) , istream_iterator<string>() );
通過加括號來提示編譯器我們這里提供的是構造函數的參數而非參數聲明,因為 (istream_iterator<string> (cin)) 不能解析為變量聲明,這個更void f ( (int i)) 不可能是函數聲明是一回事。多一對括號不可能解釋為合法的聲明語句。
2.關于double 和float 區別
一個例子
int main()


{

double x = 1e8;
while(x >0)
x--;


return 0;
}

現在的編譯器一秒就可能運行完成,
如果吧doubel x = 1e8 ,換為 float x = 1e8;
C++標準說 :
浮點類型有三種: float ,double, long double,關于精度很顯然
如果換成float 答案很詭異,因為取決于float的精度,能否表達0 1e8區間的整數
所以如果換為 float,可能運行一秒,也可能是死循環,因為如果float不能表達0 1e8區間的整數, 因為其中 n-1 = n (由于浮點精度不夠)
。
3. 一些拼寫代碼錯誤
#include <iostream>
#include <iomanip>

using namespace std;

int main()


{
int x = 1;
for (int i =0 ; i < 100; i++)

{
;
}

// 下面這行代碼會干些什么?遞增???????/
++x;
std::cout << x << std::endl;
return 0;
}

一個支持標準c++的編譯器答案輸出是 1
原因很詭異,因為有個有趣的是:注釋末尾‘??/’會被轉換為'\' ,寫個宏的都知道這個就是換行符,所以??/換轉換為\ ,而++x就相當于粘貼到注釋行的末尾 ,所以++x.,不會起作用,是注釋的一部分。
在看一個例子:
一個符號標準 c++的編譯器會報多少錯誤。
struct X


{
static bool f(int *p)

{
return p &&0[p] and not p[1:>>p[2];
}
};
先一步一步的分析
1:0[p] 其實和p[0]一樣
2: and not都是有效關鍵字 ,他們分別是&& 和!
3::>竟然也是合法的,他是]的雙字符寫法。
所以這個語句會被解析為 return p && p[0] && !p[1]>p[2] ,沒有語法錯誤。
很詭異。