我下面做內:編譯器給我警告不安全的使用操作類型「布爾」的檢查是否值是一個範圍,如果statment
if('0' <= infix.at(i)<= '9'){
// some logic
}
。我把它改爲:
if('0' <= infix.at(i)&& infix.at(i) <= '9')
現在它的工作原理。第一個不允許在C++中?
我下面做內:編譯器給我警告不安全的使用操作類型「布爾」的檢查是否值是一個範圍,如果statment
if('0' <= infix.at(i)<= '9'){
// some logic
}
。我把它改爲:
if('0' <= infix.at(i)&& infix.at(i) <= '9')
現在它的工作原理。第一個不允許在C++中?
第一個版本將是evaluated like this:
if(('0' <= infix.at(i)) <= '9')
這就是爲什麼你會得到關於bool
一個警告 - 你風與true/false <= '9'
這沒有任何意義。
有些語言允許鏈接比較運算符,但C++不是其中之一。
正如其他人所解釋的那樣,優先順序將表達式a <= b <= c
分組爲(a <= b) <= c
,並且第一部分評估爲a <= b
-通常預期返回布爾值true/false值。
當然,如果a
和/或b
是用戶定義類型,你可以創建自定義operator<=
返回一個用戶定義的對象,而不是一個布爾值,它可以支持你想讓你的鏈接。 (所以,Amber的斷言「有些語言允許你鏈接比較運算符,但C++不是其中之一」,對於用戶定義的類型是不真實的,但仍然是很好的建議 - 見下文)。您可以在運行時最容易地進行鏈接(例如,通過返回一個對象,該對象可以指示先前比較的結果以及形成lhs的值以進一步鏈接比較),但也可以使用模板表達式並獲得有效的短路評估。
這是非常罕見的一個好主意,因爲其他程序員不會期望以這種方式評估您的代碼。它會讓他們感到困惑,很可能你在幾個月後回來維護代碼,並且可能導致錯誤。無論如何,對於非用戶定義的類型,您都不能支持此類排序,並且在如何混合表達式中的值方面存在此類限制通常存在問題。沒有冒犯的意圖,但如果你需要提出這個問題,你可能還沒有準備好嘗試實施這個或導航風險。
不相關,但這些語句在Python中很酷。 – Rapptz