2016-06-14 93 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