2012-07-26 52 views
0

下面的C++代碼:如果聲明沒有工作,我怎麼想

if (a != '0.5' || a != '0.6') 
{ 
    cout << "The answer is neither 0.5 nor 0.6 " << '\n'; 
} 

我也曾嘗試

if ((a != '0.5') || (a != '0.6')) 
{ 
    cout << "The answer is neither 0.5 nor 0.6 " << '\n'; 
} 

,並試圖

if (!(a== '0.5') || !(a==0.6) 
{ 
    cout << "The answer is neither 0.5 nor 0.6 " << '\n'; 
} 

從用戶接收的數並檢查數字是0.5還是0.6;如果是的話,它應該作爲虛假陳述執行,但如果它是任何其他數字,它應該執行爲真。但是,它始終保持爲true,但當輸入0.5或0.6時它應該作爲false執行。這是不同的,當我使用一個else if語句在它正常工作是:

if (a != 0.5) 
{ 
    //what to do if true. 
} 
else if (a != 0.6) 
{ 
    //What to do if this is true and the first id wrong. 
} 
else 
{ 
    //What to do if none are true. 
} 

爲什麼不能在= if語句執行呢?

+0

好吧,我不是故意的代碼最終看起來像。 – urbanslug 2012-07-26 08:14:11

+0

好吧,如何使用if(a!='x'|| a!='y'){}語句就是我想知道的。沒有其他的請 – urbanslug 2012-07-26 08:15:40

回答

0

刪除0.5和0.6的單引號,你應該使用& &(AND)不||(OR),即: if (a != 0.5 && a != 0.6)

0

它必須是

if (a != 0.5 && a != 0.6) 
+1

爲什麼當'0.5'和'0.6'顯然是錯誤的時候這會得到upvoted ... – Marlon 2012-07-26 08:23:07

2

一個應該是浮動還是字符串?無論哪種方式,這個語法都是錯誤的'0.5',如果它是一個字符串使用雙引號。不要與浮點數/雙精度浮點數進行比較,因爲內部表示形式不會像您期望的那樣工作,請參閱how-to-correctly-and-standardly-compare-floats

+0

我先試了一下,沒有引號,它失敗了。 – urbanslug 2012-07-26 08:27:04

+0

@MosesMwaniki,但它應該是一個浮點數或字符串文字? – juanchopanza 2012-07-26 08:30:59

3

邏輯錯誤。您目前正在檢查一個數字是否同時不是0.5或不是0.6;所有數字都會通過該測試。您需要用邏輯或(&&)替換邏輯或(||)。

此外,您需要從數字中刪除單引號,否則您正在創建具有實現定義值的多字符文字。

if (a != 0.5 && a != 0.6) 
{ 
    cout << "The answer is neither 0.5 nor 0.6 " << '\n'; 
} 
0

如果a是一個字符,然後當你的財產以後類似奇怪的事情會發生:

char a = '0.5'; 
cout << "A: " a << endl; 

這將輸出(在我的編譯器,不能確保任何其他人):

A: 5 

和:

char a = '0.5'; 
if (a == '5') 
    cout << "yey" << endl; 
else 
    cout << "oops" << endl; 

這將輸出:

yey 

但我認爲這種行爲是不確定的(我不知道是肯定的)。無論如何,它不會做你認爲它會的事情。

其次,我認爲你的邏輯是錯的:

你是在說:

如果沒有0.5與否0.6

在哪裏,我認爲你的意思是

如果沒有0.5,而不是0.6

if (a != '0.5' && a != '0.6') 
1

什麼是a

的std :: string

假設:

std::string a; 
std::cin >> a; 

然後下面的代碼工作:

if (a == "0.5" || a == "0.6") 
{ 
    // Do something when it's true 
} 
else 
{ 
    // Do something when it's false 
} 

雖然 「0.5」 和 「0.6」 是爲const char *,他們將轉換爲std :: string,所以它運作良好。

爲const char *

char a[BUFSIZE]; 
std::cin >> a; 
if (strcmp(a, "0.5") == 0 || strcmp(a, "0.6") == 0) 
{ 
    // Do something when it's true 
} 
else 
{ 
    // Do something when it's false 
} 

你可以使用STRCMP比較C風格字符串

浮點/雙精度

當你在比較的花車,你可能會遇到的問題的精度。你可以編寫一些函數或Float類來解決這個問題。就像這樣:

const double EPS = 1e-8; 
inline bool FloatEqual(const double lhs, const double rhs) 
{ return std::fabs(rhs-lhs) <= EPS; } 
int main() 
{ 
    double a; 
    std::cin >> a; 
    if (FloatEqual(a, 0.5) || FloatEqual(a, 0.6)) 
    { 
    // Do something when it's true 
    } 
    else 
    { 
    // Do something when it's false 
    } 
} 

順便說

這是有趣的發現,下面的語句是相等的

if (a == "0.5" || a == "0.6") 
if (!(a != "0.5" && a != "0.6"))