Может ли кто-нибудь объяснить эти операторы c - PullRequest
1 голос
/ 26 декабря 2010

Какова функция этих операторов (= &, ~), я обнаружил, что этот код опубликован как шутка и озаглавлен

"Найдено в ранних источниках Unix:"

if(rp->p_flag & SSWAP) {
    rp->p_flag =& ~SSWAP;
    aretu(u.u_ssav);
}

РЕДАКТИРОВАТЬ: Источник: http://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html

Ответы [ 5 ]

5 голосов
/ 27 декабря 2010

~ - это унитарное побитовое дополнение , которое переворачивает биты в целое число.

Однако, прочитав комментарий и поняв, что я прочитал ваш код неправильно, я понял, что кодто, что вы представили, даже не скомпилируется в современном компиляторе.

Благодаря @Avi: оператор =& означает то, что &= означает сегодня, но этот синтаксис действительно предшествует текущемуСтандарты С, так что это действительно древний код UNIX.

Что на самом деле означало бы сегодня

Здесь & должен действовать как оператор address-of, а неоператор bitwise AND.

int main()
{
    int x = 5;
    int y = 2;
    x =& ~y;
}

Компиляция этого кода приведет к:

error: lvalue required as unary ‘&’ operand

Я действительно думаю, что была проблема в транскрипции, так как по логикедолжно быть &=, а не наоборот.

В случае, если это на самом деле &=, то это происходит поразрядно и.

4 голосов
/ 27 декабря 2010

В начале C операторы присваивания имели оператор справа. Таким образом, это было =& вместо &= и =+ вместо +=.

Таким образом, этот код просто проверяет, установлен ли определенный бит, и если да, выполняет действие и выключает бит.

3 голосов
/ 27 декабря 2010

Вы, юные болтуньи, родились слишком поздно:)

Этот код взят из очень ранней версии Unix (до V7).Шутка в том, что комментарий чуть выше: «Вы не должны это понимать» , что стало чем-то вроде легенды .

1 голос
/ 27 декабря 2010

Из рта лошади :

В введено обобщенное задание операторы, используя x = + y, чтобы добавить y к x. Запись пришла от Алгола 68 [Wijngaarden 75] через Макилроя, который имел включил его в свою версию TMG. (В B и начале C оператор было написано = + вместо + =; этот ошибка, исправленная в 1976 году, была вызвана соблазнительно простым способом обработки первая форма в лексическом B анализатор.)

1 голос
/ 27 декабря 2010

=& на самом деле два отдельных оператора: = и &, поэтому строка эквивалентна rp->p_flag = & ~SSWAP;.

~ является побитовым оператором NOT , поэтому ~SSWAP будет результатом переключения битов SSWAP. & ~SSWAP приведет к ссылке на результат ~SSWAP, который является ошибкой компиляции. Таким образом, эта вещь не будет компилироваться с использованием современного компилятора (начиная с C89), но =& эквивалентно &= на современных компиляторах.

&= применяет побитовое И к rp->p_flag и ~SSWAP и помещает результат в rp->p_flag. Конечным результатом является то, что все 0 биты в SSWAP отключат соответствующие биты в rp->p_flag, если они установлены. Это будет выполнено, только если будет выключен хотя бы один 1 бит, чтобы вызывать aretu(u.u_ssav) только в том случае, если значение rp->p_flag изменится в результате операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...