學習 C 并做一個基本的三角形練習。
如果我做的一切都正確,任何人都可以檢查我的代碼并解釋為什么我會收到這個錯誤:在 '||' 中建議在 '&&' 周圍加上括號
#include <iostream>
int main()
{
// enter 3 numbers for sides of triangle
int a, b, c;
std::cout << "Input three numbers: " << std::endl;
std::cin >> a;
std::cin >> b;
std::cin >> c;
// check what kind of traingle it is and output result
if(a == b && b == c){
std::cout << "You have an equalateral triangle." << std::endl;
}else if(a == b && b !=c || a!=b && b==c || a==c && b!=c){
std::cout << "You have an iso triangle." << std::endl;
}else{
std::cout << "You have an scalene triangle." << std::endl;
}
}
uj5u.com熱心網友回復:
您收到的錯誤訊息是 Clang 可以生成的診斷資訊
如果這些顯示為錯誤,您可能已-Werror在編譯器選項中啟用。您可以洗掉該標志以停止將警告升級為錯誤。或者,如果您不希望它針對(說實話)非常虛假的診斷發出警告(升級為錯誤),您可以添加-Wno-logical-op-parentheses到編譯器選項。
至于為什么首先生成此診斷:&&and之間的運算子優先級||并不總是很明顯,尤其是對于新程式員而言,Clang 建議您明確指定運算子優先級以確保您所寫的就是您所寫的打算。所以它要求你像這樣重寫這些行:
if(a == b && b == c) {
std::cout << "You have an equalateral triangle." << std::endl;
} else if((a == b && b != c) || (a != b && b == c) || (a == c && b != c)) {
std::cout << "You have an iso triangle." << std::endl;
} else {
std::cout << "You have an scalene triangle." << std::endl;
}
額外的括號使警告消失。
據我所知,您的代碼中實際上沒有邏輯錯誤(布爾邏輯的行為與您期望的一樣),實際上,如果您將此代碼發送到不同的編譯器,它們會毫無問題地編譯它。所以這實際上只是 Clang 的一個特殊怪癖。
uj5u.com熱心網友回復:
編譯器建議您使用括號使您的第二個if陳述句更清晰/更易于決議。
特別是,您應該使用括號對&&陳述句中的陳述句進行分組。||也就是改變這段代碼
(a == b && b !=c || a != b && b == c || a == c && b != c)
到
((a == b && b != c) || (a != b && b == c) || (a == c && b != c))
值得注意的是,這是一個“風格錯誤”;第一種形式并不是嚴格不正確的代碼(實際上,在沒有編譯器標志的情況下,我能夠很好地編譯和運行它),但是以第二種方式撰寫它是一種很好的做法。
如果您將-Wall標志傳遞給編譯器(或者更具體地說,在這種情況下,-Wlogical-op-parentheses標志),這將顯示為警告。傳遞-Werror會將這些警告更改為錯誤,這里似乎就是這種情況。最好同時使用-Walland -Werror,因為編譯器會指出類似這樣的潛在清晰度問題,并強制您在繼續編譯之前修復它們。
uj5u.com熱心網友回復:
這肯定會導致意見分歧(如果你站在另一邊,甚至可能表明自己的身份,請投反對票 - 這可能很有趣,沒有人應該親自投反對票或贊成票)但我屬于你需要知道的同類在您嘗試將任何代碼推送到生產環境之前,C 語法。
事實仍然是||優先級低于&&。這應該是你的第二天性,就像二元運算子的優先級一樣, 應該*是。用括號強調顯而易見的東西會引入噪音并使您的代碼更難閱讀。我建議您關閉該特定警告,然后按。
請注意,在您的特定情況下,盡管第二個條件簡化為
else if (a == b || a == c || b == c)
因為你已經消除了等邊的可能性。同樣,一些軟體公司堅持認為if陳述句都是互斥的,因為它們可以在不破壞代碼的情況下任意重新排序。恐怕還有更多的意見。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477237.html
