2016-06-14 40 views
-3

我正在學習如何在C++寫的SDL程序,我碰到這個代碼就來了:什麼把一個'|'在函數參數上做什麼?

SDL_Renderer *ren = 
    SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); 
//              ^I have no idea what this means? 

我不知道這是否是一個特定的C++功能?我的猜測來自shell腳本背景表明它可能是一個管道(我知道它顯然不是這樣),或者它只是一個按位或(idk,如果它就是這樣)。

|在函數參數中使用它的含義是什麼?

+3

請參閱[按位邏輯運算符](http://en.cppreference.com/w/cpp/language/operator_arithmetic#Bitwise_logic_operators)。 – songyuanyao

+0

它是按位或運算符。 '01 | 10 = 11' – Arunmu

+1

非常有用的googlestring:「C++操作符」。如果你有一本書,操作員在索引中。 (你會想看更多的。)如果你沒有一本書,看看[這裏](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide - 和 - 清單),然後再購買。 – molbdnilo

回答

3

這些是您可以設置的標誌。在這種情況下,|指的是按位運算符。

在您的示例中,您可以方便地通過單個參數組合多個標誌。

假設兩個標誌有以下值:

SDL_RENDERER_SOFTWARE = 1 // Binary 0001 
SDL_RENDERER_ACCELERATED = 2 // Binary 0010 
SDL_RENDERER_PRESENTVSYNC = 4 // Binary 0100 

邏輯按位兩個OR,會離開你的flag值6。 我們可以很容易地從該標誌已使用逐AND:

flag = SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC // flag = 6 (0110) 
flag & SDL_RENDERER_SOFTWARE == 0 // Not set 
flag & SDL_RENDERER_ACCELERATED == 2 // Set 
flag & SDL_RENDERER_PRESENTVSYNC == 4 // Set 

注意,它是這裏重要的標誌是兩個大國,以確保所有標誌組合產生獨特的值設置這個值確定。

+0

所以它基本上意味着它將兩個選項SDL_RENDERER_ACCELERATED和SDL_RENDERER_PRESENTVSYNC傳遞給CreateRenderer,對吧? – hoholee12

+0

@ hoholee12正確。 –

+0

今天學到了新東西,謝謝! :D – hoholee12

0

|bitwise OR operator,在這種情況下,它用於將一組標誌傳遞給SDL_CreateRenderer函數。

試想一組標誌:

const int FLAG1 = 0x1 << 0; // 0b00...0001 
const int FLAG2 = 0x1 << 1; // 0b00...0010 
const int FLAG3 = 0x1 << 2; // 0b00...0100 
/* ... */ 

你可以從這些標誌的二進制表示看,他們只有一個位設置爲1,這一點是每個標誌不同,也就是說你可以使用|運營商將它們結合起來......

int flag_a = FLAG1 | FLAG2; // 0b00...0011 
int flag_b = FLAG1 | FLAG3; // 0b00...0101 

...同時仍然能夠檢索使用位AND(&)運營商原有的標誌:

int is_flag1_set = flag_a & FLAG1; // 0b00...0001 != 0 
int is_flag2_set = flag_a & FLAG2; // 0b00...0010 != 0 
int is_flag3_set = flag_a & FLAG3; // 0b00...0000 == 0