2013-05-01 70 views
4

我的問題是:「我可以將任務的結果傳遞給C++中的函數嗎?」我可以將賦值的結果傳遞給C++中的函數嗎?

我想這樣做的原因是變量具有特定的類型,例如, 「int」,所以我賦值給變量,並將整個事件傳遞給以「int」作爲參數的重載函數。

主要理由這樣做是爲了使代碼有點小,更易於閱讀,所以不是:

val = 2 
function(val); 

我得到:

function(val = 2); 

可以嗎? 如果是這樣,是否有一個約定,說這是不好的編碼習慣出於某種原因?

謝謝, 飼料

+2

「更小」我可以看到。 「更容易閱讀」我不明白。不要試圖變得聰明,簡單。先分配,然後調用該函數。這絕對不是慣用的C++代碼,也不推薦。 – 2013-05-01 11:50:42

+1

如果我看到'function(val = 2);'我的第一印象可能是你寫了'function(val == 2);',即傳遞一個布爾值。你的第一種方法顯然更好。 – john 2013-05-01 11:55:25

+0

這兩個有效的:) :)我沒有考慮它將如何看待下一個用戶:o – 2013-05-01 12:01:14

回答

4

每一段§ 5.17/1

賦值運算符(=)和化合物賦值運算符的所有組 從右到左。所有這些操作數都需要一個可修改的左值作爲它們的左邊的 操作數,並返回一個指向左操作數的左值。

function(val = 2)後,2分配給val然後val值傳遞給函數。

談到可讀性並不容易,我個人不會在我的代碼中使用這種方式。

+0

謝謝你的回答:),我不明白關於任務鏈的最後一部分.... – 2013-05-01 11:53:12

+0

表達式'a = b = c'被評估爲'a =(b = c)'。 'b = c'將把'c'分配給'b',然後產生'b'作爲結果。然後將其分配給'a',從而產生'a'結果。您可以將任何表達式(希望我不會偏離該術語確切含義的窗口太遠)轉換爲函數,包括包含賦值的函數。請注意,在用戶定義類型上使用重載運算符時,可以中斷分配產生左側結果的規則。 – 2013-05-01 12:17:17

+0

非常感謝:) – 2013-05-01 12:21:10

1
"Can I pass the result of an assignment to a function in c++?" 

是的,當然我們可以做到這一點。編譯器會破壞這個語句function(val = 2) in 兩步首先將2分配給val然後用參數2調用函數。因此,第一個兩個班輪的方法比第二個更清晰和可讀。

+1

實際上,這個調用將使用'val'而不是'2'。這在調用'void function(int&param)'時很重要 - 你不能修改2,但你可以修改'val'。 – MSalters 2013-05-02 12:39:34

+0

函數將被調用val是2它不是通過引用其值的調用引用的調用。 – birubisht 2013-05-03 03:17:46

+0

爲什麼你認爲這是一個價值的呼叫?此外,還有其他一些可以注意到差異的情況。例如。當'function'採用另一種類型,並且需要轉換時,'val'將被轉換。 – MSalters 2013-05-03 09:12:08

1

C++確實允許這樣做,但如果我是你,我不會這樣做。

並非所有C++允許你做的事情都是一個好主意。一個好的程序員必須考慮兩件事:可讀性和可維護性。博客(我不記得是誰)曾經說過程序員不是爲計算機編程的,他們應該爲程序員編寫程序。

這意味着你應該嘗試儘可能容易地閱讀。將多行壓縮爲一行實際上降低了可讀性,因爲讀者必須停下來思考多於一件事情,他們必須分析濃縮陳述而不是僅僅閱讀它。

你想做什麼也可以隱藏由錯別字創建的錯誤。比如說,你輸入了

function(val == 2) 

錯誤。編譯器也會允許這樣做,因爲它會將bool轉換爲int。另一位讀者也不會接受這個錯誤,除非他/她很好地知道參數列表。

如果您對提示和技巧以及有關良好編程構建技巧的建議感興趣,我會極力推薦Code Complete 2。我已經閱讀了這本書多年,我仍然在學習新的東西來改進我的代碼。

+0

感謝那個RobbieE。對我來說有點額外的信息:)我也會看看這本書。 – 2013-05-28 11:11:17

相關問題