2016-12-06 42 views
1

第一學期在這裏學生。我對bitand(&)與邏輯和(& &)之間的差異以及與bitor(|),邏輯或(||)和Xor(^)相同的差異感到困惑。具體來說,我有一些我認爲需要||的代碼或& &功能,但..顯然不是?這裏是有問題的代碼:有人可以解釋&和&&的區別嗎?

cout << "Please enter your biological sex (M or F): " << endl; 
cin >> sex; 

//Repetition Structure 
while (toupper(sex) != 'M' && 'F') 
{ 
    cout << "Invalid entry. Please enter your biological sex (M or F): " << endl; 
    cin >> sex; 
} //end while 

我試着用||起初,不管我怎麼回答,它都給了我「無效輸入」的回覆。我在論壇上四處張望,發現& &會更好,並嘗試使用它。它起初 - 工作。然後,由於沒有明顯的原因,它停止以'F'作爲答案(代碼沒有改變)。

爲了解決這個問題,我嘗試使用XOR(^),它失敗了,然後BITAND(&,而不是& &),這顯然使得它正常工作一次。但是,我已經看到警告,您仍然可以使用&或& &得到正確的答案,但其中一個不會等於另一個,並可能在稍後導致問題。這就是爲什麼我需要澄清(也只是知道的好東西)。

更新:由於這被標記爲重複,我會澄清我的意圖:我想知道更多關於&和& &,爲什麼你用一個,而不是其他,以及相同的信息進行^, |和||。帶標籤的線程有使用一個與另一個的例子,但他們沒有解釋操作本身的細節。由於我很難理解行動本身的性質,這些解釋至關重要;僅僅舉例並不能說明我的理解。

+3

'toupper(sex)!='M'&& toupper(sex)!='F'' –

+0

'&&'F''總是對的 – Raindrop7

+0

任何*非零*積分值是可以考慮的'C++'中的ed ** true **。字符('char')基本上是整數,所以所有字符(除了空字符''\ 0'')都被計算爲** true **。所以,當你去'&&'F'時,你在說'&& true'。 – Galik

回答

5

這不是你使用位操作符的東西。你想輸入的字符串比較期望的「M」或「F」因此,所有你需要做的是:

while (toupper(sex) != 'M' && toupper(sex) != 'F') {... 

在你的代碼失蹤第二TOUPPER(性別)=一部分。你需要將這個陳述看作是兩個必須滿足的要求,以便繼續下去。
第一個是:TOUPPER(性別)= 'M'
二上:TOUPPER(性別)= 'F'
爲什麼& &(邏輯和)應該是這兩個之間的原因是因爲如果性別不是M並且同時它不是F,則希望while循環運行。

&|這樣的運算符用於比較變量的位。例如,如果您想使用位標誌,則將每個標誌位設置爲一位,並將結果標誌組合與&進行比較。

編輯:所以對於位標誌,他們比較你給他們一點一點的價值。因此,您對位標記所做的操作是將它們定義爲2(1,2,4,8 ...)的冪,它們分別代表二進制位置(00000001,00000010,00000100,00001000 ...)的位置。因此,例如,當您有標誌時:

a = 1; 
b = 2; 
c = 4; 

您可以使用``|到你的一組標誌:

setFlags = setFlags | a | c; 

這將比較setFlags與a和c的位。

00000000 
|00000001 // a 
|00000100 // c 
=00000101 // result 

所以|運營商檢查同一位置的所有位,如果其中有一個爲真,其結果將是真實的,就像邏輯OR。 現在讀他們使用&這樣的:

if (setFlags & a) 

其作用:

00000101 // setFlags 
&00000001 // a 
=00000001 // result 

這僅留下位,他們都是真實的(就像邏輯AND),因此你可以得到true如果setFlags包含該標誌。

00000101 // setFlags 
&00000010 // b 
=00000000 // result 

在這種情況下,在同一個位置上沒有位設置爲true,所以結果告訴你b沒有在setFlags中設置。

+0

你能解釋一下位標誌?這不是本學期我的初學者C++類所涵蓋的術語。謝謝! – CVHansen

0
while (toupper(sex) != 'M' && 'F') is evaluated as: 

while(true && (bool)'F'): while(true && true) // or 
while(false && (bool)'F'): while(false && true) 

因爲如果性分配的「m」或「M」,則條件爲真,並且您上的非零值「F」的結果所使用的邏輯和&&是總是如此。

它就像:if((bool)5)這是真的,因爲任何非零值的布爾值始終爲真。

,以糾正例如:

while (toupper(sex) != 'M' && toupper(sex) != 'F') 

邏輯運算符如邏輯和&&,邏輯或||,...返回booltruefalse; 10他們評估表達式。

位運算符按位一樣和&,按位或| ......對位返回任何值,在y工作:

unsigned char uc1 = 13; // 0x01 00001101 
unsigned char uc2 = 11; // 0x03 00001011 

unsigned char uc3 = (uc1 & uc2);// 00001001 

,你可以看到1 & 1 = 10 & 1 = 01 & 0 = 01 & 1 = 10 & 0 = 0 ... 結果我們00001001這是十進制9

相關問題