2013-01-21 68 views
1

我下面做內:編譯器給我警告不安全的使用操作類型「布爾」的檢查是否值是一個範圍,如果statment

if('0' <= infix.at(i)<= '9'){ 
// some logic 
} 

。我把它改爲:

if('0' <= infix.at(i)&& infix.at(i) <= '9') 

現在它的工作原理。第一個不允許在C++中?

+4

不相關,但這些語句在Python中很酷。 – Rapptz

回答

8

第一個版本將是evaluated like this

if(('0' <= infix.at(i)) <= '9') 

這就是爲什麼你會得到關於bool一個警告 - 你風與true/false <= '9'這沒有任何意義。

有些語言允許鏈接比較運算符,但C++不是其中之一。

1

正如其他人所解釋的那樣,優先順序將表達式a <= b <= c分組爲(a <= b) <= c,並且第一部分評估爲a <= b-通常預期返回布爾值true/false值。

當然,如果a和/或b是用戶定義類型,你可以創建自定義operator<=返回一個用戶定義的對象,而不是一個布爾值,它可以支持你想讓你的鏈接。 (所以,Amber的斷言「有些語言允許你鏈接比較運算符,但C++不是其中之一」,對於用戶定義的類型是不真實的,但仍然是很好的建議 - 見下文)。您可以在運行時最容易地進行鏈接(例如,通過返回一個對象,該對象可以指示先前比較的結​​果以及形成lhs的值以進一步鏈接比較),但也可以使用模板表達式並獲得有效的短路評估。

這是非常罕見的一個好主意,因爲其他程序員不會期望以這種方式評估您的代碼。它會讓他們感到困惑,很可能你在幾個月後回來維護代碼,並且可能導致錯誤。無論如何,對於非用戶定義的類型,您都不能支持此類排序,並且在如何混合表達式中的值方面存在此類限制通常存在問題。沒有冒犯的意圖,但如果你需要提出這個問題,你可能還沒有準備好嘗試實施這個或導航風險。

相關問題