2

我有三個函數返回整數錯誤代碼,例如:在C++中同時分配和條件測試

int my_function_1(const int my_int_param); 
int my_function_2(const int my_int_param); 
int my_function_3(const int my_int_param); 

爲了簡潔起見,我想同時分配和測試錯誤。下面的工作將是可移植的嗎?

int error=0; 
... 
if (error || 
    (error = my_function_1(val1) || 
     error = my_function_2(val2) || 
     error = my_function_3(val3))) { 
    std::cout << "AN ERROR OCCURRED!!!" << std::endl; 
} 

謝謝!

+0

error = my_function_1(val1) - >將始終評估爲true。 – DumbCoder 2010-09-17 15:58:59

+0

即使錯誤值爲0? – 2010-09-17 16:00:02

+2

你真的想讓它難以閱讀嗎?它讓我尖叫。 – 2010-09-17 16:00:31

回答

4

爲什麼不拋出異常?

void my_function_1(const int my_int_param); 
void my_function_2(const int my_int_param); 
void my_function_3(const int my_int_param); 

try { 
    my_function_1(...); 
    my_function_2(...); 
    my_function_3(...); 
} catch(std::exception& e) { 
    std::cout << "An error occurred! It is " << e.what() << "\n"; 
} 
+0

我會在哪裏拋出異常?在我的函數調用後添加一個條件?或者在函數內部呢? – 2010-09-17 16:07:38

+0

函數本身。存在例外,因爲錯誤代碼很糟糕。當你遇到錯誤時,你只需要拋出std :: runtime_error(「一些錯誤字符串」)。你不必處理錯誤代碼或任何廢話。 – Puppy 2010-09-17 16:12:00

+0

好想法。我可能會修改代碼以使用異常。 PS你是這裏更有幫助和不那麼尖銳的評論者之一。有些人(即Mark Ransom,見下文)似乎無法通過自學成才/開始編碼人員回答認真的問題,而不會插手諷刺/嘲諷。當然,我理解人們想告訴你,如果你編碼風格很差,但至少要解釋原因。您的信息和直接的反應表示讚賞,並希望其他人會跟隨你的領導...... – 2010-09-17 16:34:39

0

error初始化爲0。因此&&將始終計算爲false。因此if條件的其他部分從不被評估。所以這段代碼將不起作用。如果您刪除&&條件,則代碼應該可移植地工作,因爲標準保證了這種情況下的評估順序。

+0

好點。我將其更改爲or。對於那個很抱歉。我只是在那裏包含那個最初的錯誤來測試是否發生了以前的錯誤。該聲明現在是否正確? – 2010-09-17 16:02:37

+0

是的..現在有意義..只有當其中一個方法返回一個非零值時纔會輸入「ifif」條件。 – Naveen 2010-09-17 16:07:14

2

我不明白你爲什麼在函數的開頭有error &&,但其餘的應該做你想做的。標準保證||運營商的短路評估。儘管如此,我會認爲它很糟糕。

編輯:根據您的意見,您需要將error &&替換爲error ||。我還會補充說,這是使用異常而不是錯誤代碼的一個很好的理由,它使您的代碼更容易閱讀。

+0

如果發生以前的錯誤(即,如果發生錯誤,請不要進行這些函數調用...),我會將它短路。那是不好的風格? – 2010-09-17 16:01:01

+0

@ Jason-如果有人不得不問你爲什麼寫這樣的代碼,那很可能是壞風格。編寫良好的代碼應該易於閱讀和理解。因此,簡潔並不總是C++代碼的有利品質。爲什麼不在功能本身打印出錯誤信息?如果這是你在錯誤情況下做的唯一不同的事情,那麼這段代碼會變得更加簡單和可讀。 – bta 2010-09-17 16:03:51

+0

不,還有更多...我需要短路所有後來的文件io邏輯。至於它的不好的風格,我基本上是自學了C++,所以我想我的風格非常糟糕!任何建議的資源?除了糾錯堆棧溢出的人? :P – 2010-09-17 16:10:36

0

是的,&&||次變更後它會工作。但它太混亂了(在測試中使用=令人困惑)並沒有多大好處。

你可以去exception行另一個海報建議,或者乾脆把你的檢查代碼功能,並做下面的事情。

int checked(){ 
    int error = 0; 
    error = my_function_1(val1); if (error) return error; 
    error = my_function_2(val1); if (error) return error; 
    error = my_function_3(val1); if (error) return error; 
    return error; 
} 

我相信任何一個程序員很容易理解什麼是在這裏完成。