2011-04-26 157 views
0

我是C++的新手,僅在Java中擁有編程知識。任何人都可以請解釋下面的代碼的含義是:請解釋以下C++代碼片段

#define DEF 134 ; 
int k; 
char msk; 
PMSK *pm; //At the begining of class some declaration 

// i is some counter(int) 
if ((nVersion >= 2004) && (nVersion < 2008)) 
{    
    k = to_bits(DEF, &msk); 
    if (pm->orbits[k] & msk)    // for version >= 2004 
    { 
     x = atoi(grprs[i]); 
     if (!defpair(i, x)) 
      pm->orbits[k] &= 0xFF^msk;  // turn off bit 
    } 
} 

to_bits()是方法,該方法將返回一個整數值和一個(炭)MSK值(例如1000)。它涉及一些操作。

什麼是pm->orbits[k]?我們可以用Java替代它嗎,如pm.orbits[k]? 另外,代碼的最後一行究竟是幹什麼的?

+1

'#define DEF 134;'...刪除分號,否則你的代碼將無法編譯。 – Nawaz 2011-04-26 06:47:09

+0

是的,刪除。謝謝。 – JavaBits 2011-04-26 06:48:09

+0

http://stackoverflow.com/questions/5577225/explain-the-following-c-code-part – atzz 2011-04-26 06:59:18

回答

2

What is pm->orbits[k]? can we replace it in java like pm.orbits[k]?

基本上,是的。 ->運算符取消引用,然後訪問一個字段(也稱爲訪問指針指向的對象的字段/函數)。但是,如果您有一個參考類型,那麼您將獲得「免費」取消參考。

PMSK *pm1; // assume this has been initialized to point to something valid 
PMSK &pm2; // assume this is a valid reference 
PMSK pm3; // assume this is a valid declaration 

pm1->orbits[0]; // accesses field orbits[0] of object pointed to by pm1 
(*pm1).orbits[0]; // equivalent to above statement 

pm2.orbits[0]; // it's implicitly understood that de-referencing should take place 
pm3.orbits[0]; // no need to dereference 

解剖的代碼的最後一行:

pm->orbits[k] &= 0xFF^msk;  // turn off bit 
  1. ^是按位異或操作者(也稱爲異或)。基本上它返回的位值爲1,如果兩個位不相等,否則返回0。

  2. &=是按位和分配運算符。等效於以下內容:

     
    pm->orbits[k] = pm->orbits[k] & (0xFF^msk); 
    
    按位和運算符會匹配相同的位,並確定兩者是否都是1.如果是,則結果爲1.否則,它爲0.所以100001 & 100100 = 100000(二進制數)。 因此,它需要msk中的任何內容,切換最低8位(1 -> 00 -> 1),然後按位與當前的pm->orbits[k]字段進行比較。最後,結果分配回pm->orbits[k]

在Java中,它需要有一個明確的檢查,以某種方式從數字轉換的結果爲布爾值。然而,在C++中隱含地理解,任何不是0的東西都是真的。

if(1) // same as if(1!=0) 
if(2) // same as if(2!=0) 
if(0) // same as if(0!=0) 
if(-1) // same as if(-1!=0) 
+0

感謝您的回答。我沒有得到下面這行的含義 - 如果(pm-> orbits [k]&msk) - 當這個條件成立時,這是一個AND運算,所以如果100001和100100是2個值,那麼wat會發生?請解釋。 – JavaBits 2011-04-26 09:16:00

+0

我澄清了什麼按位和做什麼,爲什麼你可以把數字放入條件,仍然得到工作代碼。 – helloworld922 2011-04-26 15:13:28

+0

你知道了。感謝您的解釋。 – JavaBits 2011-04-27 09:21:43

1

是的,你可以替換你提到的代碼。 ' - >'操作符將指向PMSK對象的指針取消引用。 Java沒有指針,只有引用,但它們以相同的方式使用。

最後一行清零MSK設置的位,但它是這樣的正常進行:

pm->orbits[k] &= ~msk; 

如果你想設置MSK位,你會使用:

pm->orbits[k] |= msk; 

此外,下面的線將需要評估爲布爾表達式,其中如在C++它只是需要爲非零:

if ((pm->orbits[k] & msk) != 0) 
{ 
    ... 
} 
+0

能否詳細說明一下。通過清除所設置的位,你是什麼意思。如果msk有1000個值。那麼會發生什麼?你可以舉個小例子來解釋它可能不準確。謝謝你的幫助。 – JavaBits 2011-04-26 06:53:06

+0

Java中存在相同的操作。如果您查看整數內的位,「&=〜msk」將清除當前在msk中設置的任何位。結果存儲在'pm->軌道[k]'中。所以如果當前設置了「0x1000」,那麼它將包含「0x0000」。如果它當前設置爲「0x1001」,則它將包含「0x0001」等。 – trojanfoe 2011-04-26 06:56:53

+0

感謝您的回答。我沒有得到下面這行的含義 - 如果(pm-> orbits [k]&msk) - 當這個條件成立時,這是一個AND運算,所以如果100001和100100是2個值,那麼wat會發生?請解釋。 – JavaBits 2011-04-26 09:18:19

0

什麼是pm->軌道[k]?我們可以用java代替 它像pm.orbits [k]嗎?

是的,pm是一個指針,->表示法是如何訪問指針上的成員。

最後一行是一個按位操作,稱爲exclusive or^運算符是相同的,並在Java中執行相同的操作。

0

- >運算符取消引用一個指針來選擇一個字段。

最後一行代碼與0xFF的msk值進行按位異或(XOR)。然後該值與位於索引k的pm-> orbits數組按位進行與運算。

這會幫助你學習C++以及與此代碼

幾乎任何介紹性的C++文本都會有這個信息。