[英]Can I multiply an int with a boolean in C++?
我的GUI中有一個顯示圖表的小部件。 如果我有多個圖表,GUI上的矩形會顯示一個圖例。
我有一個QStringlist (legendText)
,它包含圖例的文本。 如果不需要圖例, legendText
將為空。 如果有一個圖例, legendText
會保存文本。
為了找到圖例周圍的矩形高度,我想執行以下操作:
int height = 10;
QStringList legendText;
...
height = height * (legendText->size() > 0);
...
將int
與boolean
相乘是一個好主意/好的風格嗎? 我會遇到問題嗎?
如果有點不清楚,這在技術上很好。
bool
將被提升為 int
,因此結果是明確定義的。 但是,查看該代碼我不會立即獲得您想要實現的語義。
我只想寫下這樣的東西:
height = legendText->isEmpty() ? 0 : height;
這使您的意圖更加清晰。
根據標准(§4.5/ 6),它完全沒問題:
bool
類型的prvalue可以轉換為int
類型的prvalue,false
變為零,true
變為1。
但是,我建議使用isEmpty
而不是將size
與zero height = height * (!legendText->isEmpty());
或者使用條件運算符作為其他答案建議(但仍使用isEmpty
而不是.size() > 0
)
您可以使用條件(三元)運算符:
height = ( legendText->size() >0 ) ? height : 0 ;
也許這個?
if(legendText->isEmpty())
{
height = 0;
}
要么
int height = legendText->isEmpty() ? 0 : 10;
有些人可能會發現以下信息很有用(下面的代碼應該在每個時鍾周期都很重要的高性能程序中考慮,這里的目的是展示替代技術,我不會在這種特殊情況下使用它)。
如果你需要沒有分支的快速代碼,你可以使用按位運算符實現int乘法與布爾值。
bool b = true;
int number = 10;
number = b*number;
可以優化為:
number = (-b & number);
如果b
為true
則-b
為-1
,所有位都設置為1
。 否則所有位都為0
。
布爾NOT( !b
)可以通過XOR'ing b
以1
( b^1
)來實現。
所以在你的情況下我們得到以下表達式:
height = (-(legendText->isEmpty()^1) & height);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.