2015-10-22 2 views
0

Я пишу драйвер Linux для своего китайского arduino. В какой-то момент мне нужно изменить скорость передачи. Я искал примеры и обнаружил, что листинг:Что делает этот оператор?

Listing 2 - Setting the baud rate. 

struct termios options; 

/* 
* Get the current options for the port... 
*/ 

tcgetattr(fd, &options); 

/* 
* Set the baud rates to 19200... 
*/ 

cfsetispeed(&options, B19200); 
cfsetospeed(&options, B19200); 

/* 
* Enable the receiver and set local mode... 
*/ 

options.c_cflag |= (CLOCAL | CREAD); 

/* 
* Set the new options for the port... 
*/ 

tcsetattr(fd, TCSANOW, &options); 

Следующего последнюю строку коды имеет оператор |=. Что оно делает? Я никогда этого не видел.

+1

'a | = b;' -> 'a = a | b; '(с той разницей, что' a' оценивается только один раз с помощью оператора '| =', спасибо Filipe!) – Kninnug

+0

'| =' является составным побитовым оператором 'inclusive OR'. – haccks

+3

@Kninnug Это, как правило, верно, но чтобы быть технически корректным, вы должны упомянуть, что 'a | = b' эквивалентно' a = a | b', за исключением того, что 'a' оценивается только один раз. Это важно, если выражение 'a' имеет побочные эффекты. –

ответ

3
options.c_cflag |= (CLOCAL | CREAD); 

, как правило, эквивалентна

options.c_cflag = options.c_cflag | (CLOCAL | CREAD); 

кроме options.c_cflag вычисляется только один раз, что не имеет значения в приведенном выше выражении, но было бы важно, если options.c_cflag какие-либо побочные эффекты (например, если это были *options.c_cflag++)

+2

Если вы хотите сделать ответ из этого, по крайней мере сделайте это законченным. Вы читали мой комментарий? –

+0

@ FilipeGonçalves Только что, спасибо. –

+0

Хорошо, теперь я могу upvote :) –

Смежные вопросы