1、關(guān)于初始化:
deque<string> Deque;// 一個(gè)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>()); // 一種初始化

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

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

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

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

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


{

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


return 0;
}

現(xiàn)在的編譯器一秒就可能運(yùn)行完成,
如果吧doubel x = 1e8 ,換為 float x = 1e8;
C++標(biāo)準(zhǔn)說 :
浮點(diǎn)類型有三種: float ,double, long double,關(guān)于精度很顯然
如果換成float 答案很詭異,因?yàn)槿Q于float的精度,能否表達(dá)0 1e8區(qū)間的整數(shù)
所以如果換為 float,可能運(yùn)行一秒,也可能是死循環(huán),因?yàn)槿绻鹒loat不能表達(dá)0 1e8區(qū)間的整數(shù), 因?yàn)槠渲?n-1 = n (由于浮點(diǎn)精度不夠)
。
3. 一些拼寫代碼錯(cuò)誤
#include <iostream>
#include <iomanip>

using namespace std;

int main()


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

{
;
}

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

一個(gè)支持標(biāo)準(zhǔn)c++的編譯器答案輸出是 1
原因很詭異,因?yàn)橛袀€(gè)有趣的是:注釋末尾‘??/’會(huì)被轉(zhuǎn)換為'\' ,寫個(gè)宏的都知道這個(gè)就是換行符,所以??/換轉(zhuǎn)換為\ ,而++x就相當(dāng)于粘貼到注釋行的末尾 ,所以++x.,不會(huì)起作用,是注釋的一部分。
在看一個(gè)例子:
一個(gè)符號(hào)標(biāo)準(zhǔn) c++的編譯器會(huì)報(bào)多少錯(cuò)誤。
struct X


{
static bool f(int *p)

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