#include <iostream>
using namespace std;
void funcOne()
{
cout << "one";
}
void funcTwo()
{
cout << "two";
}
int main()
{
int vienadojums;
cout << "Type [K] or [L]: ";
cin >> output;
if (output == 'K' || 'k')
{
funcOne();
}
else if (output == 'L' || 'l')
{
funcTwo();
};
return 0;
}
無論我輸入什么輸入,它都會輸出funcOne()。使用此代碼,我想制作,因此用戶可以通過輸入 [K] 或 [L] 來選擇 2 個不同的數學問題公式。但是由于某種原因,無論您輸入什么,它都會顯示funcOne()
uj5u.com熱心網友回復:
if (output == 'K' || 'k')
這是真的,如果:
output等于'K'
或者
'k'(不等于零)
第二個條件總是計算為真。
你想要的是:
if ( ( output == 'K' ) || ( output == 'k' ) )
第二個條件也一樣。
我在這里假設一個編輯工件:
int vienadojums;
cout << "Type [K] or [L]: ";
cin >> output;
你從來沒有定義過output,你也從來沒有使用過vienadojums。如果它們是同一個變數,那么您會期望一個intfrom 輸入,而不是 a char(正如您稍后在代碼中所假設的那樣)。true無論用戶輸入什么,您的第一個條件總是評估此錯誤,但您也必須修復此錯誤。
(旁注,當您從用戶輸入中讀取時,請檢查用戶是否沒有輸入數字。對于 C 和,請檢查該回傳值。)intcin.fail()scanf()
這里要帶走的元資料:總是在子運算式周圍加上括號,并盡可能嚴格地啟用編譯器警告;只有明確地告訴編譯器你想要什么,你才能讓編譯器有機會告訴你你可能在哪里犯了錯誤。編譯器可以而且應該警告您以上所有內容。
uj5u.com熱心網友回復:
在 C 中,字符文字(例如,'k')將根據背景關系轉換為布爾運算式,其中 true 是任何非空值(即該值不是空字符'\0'?),而 false 是空值。這發生在編譯器期望布爾運算式的任何背景關系中,例如 if 陳述句的子句。
因此,當您撰寫 時if (output == 'K' || 'k'),右側的字符文字會根據背景關系轉換為布林值,并且此運算式在邏輯上等價于if (output == 'K' || true),其計算結果始終為true。
正確的寫法是if (output == 'K' || output == 'k').
? 這是空字符,'\0'而不是字符文字'0'
uj5u.com熱心網友回復:
在您的 if 陳述句中,條件始終為真,因為:
[x] or true => true
[x] => (output == 'K')
'k'是一個真實的價值
不管結果如何output == 'K'
uj5u.com熱心網友回復:
將變數宣告vienadojums為 char 型別
char vienadojums;
并使用它而不是變數output,因為在 if 陳述句中您將它與字符進行比較。
或者代替變數的宣告vienadojums
char vienadojums;
貼花
char output;
并更改 if 陳述句中的條件,例如
if (output == 'K' || output == 'k')
{
funcOne();
}
else if (output == 'L' || output == 'l')
{
funcTwo();
};
否則,例如這個 if 陳述句
if (output == 'K' || 'k')
始終評估為真獨立于存盤在變數中的值,output因為字符文字'k'不等于0.
也就是上面的if陳述句等價于
if ( ( output == 'K' ) || ( 'k' != 0 ) )
請注意,通常當您有許多函式需要從中選擇一個函式來呼叫該方法時,使用 if 陳述句不靈活。
相反,您可以將所有函式和函式的相應識別符號存盤在容器中,例如陣列中。然后根據用戶輸入從容器中選擇需要的功能。
例如
#include <iostream>
#include <utility>
#include <iterator>
#include <algorithm>
#include <cctype>
void funcOne()
{
std::cout << "one\n";
}
void funcTwo()
{
std::cout << "two\n";
}
int main()
{
std::pair<char, void( * )( void )> expressions[] =
{
{ 'l', funcOne }, { 'k', funcTwo }
};
std::cout << "Type any of ";
bool following = false;
for (auto &[selection, func] : expressions)
{
if (following)
{
std::cout << ", ";
}
std::cout << '\'' << selection << '\'';
following = true;
}
std::cout << " : ";
char selection = '\0';
std::cin >> selection;
auto it = std::find_if( std::begin( expressions ), std::end( expressions ),
[&]( const auto &item )
{
return item.first == ::tolower( ( unsigned char )selection );
} );
if (it != std::end( expressions ))
{
it->second();
}
else
{
std::cout << "Invalid input.\n";
}
}
例如,程式輸出可能看起來像
Type any of 'l', 'k' : L
one
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/457681.html
