は、これらの演算子の機能(= &、〜)は何であるこれらのCの演算子を説明することができ、私はこのコードは冗談として掲載して は、いずれか
を題した「早期Unixのソースで発見:」
if(rp->p_flag & SSWAP) {
rp->p_flag =& ~SSWAP;
aretu(u.u_ssav);
}
EDIT: 出典:http://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html
は、これらの演算子の機能(= &、〜)は何であるこれらのCの演算子を説明することができ、私はこのコードは冗談として掲載して は、いずれか
を題した「早期Unixのソースで発見:」
if(rp->p_flag & SSWAP) {
rp->p_flag =& ~SSWAP;
aretu(u.u_ssav);
}
EDIT: 出典:http://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html
~
は、unary bitwise complementあるFLI psビットを整数で表します。
しかし、コメントを読んでコードを間違って読んだことを知りましたが、あなたが提示したコードは、近代のコンパイラでもコンパイルされません。
@Aviのおかげで、オペレータ=&
は今日の意味で&=
を意味しますが、この構文は現行のC標準よりも実際に古くなっています。
何であることは本当にここ&
今日
を意味するだろうがbitwise AND
オペレータにaddress-of
オペレーターとして働き、そしてべきではありません。
int main()
{
int x = 5;
int y = 2;
x =& ~y;
}
を生成します:
error: lvalue required as unary ‘&’ operand
を私は本当に問題は、転写にあった、論理的に、それは&=
ではなく、他の方法であるべきだと思います。
実際には&=
の場合は、bitwiseとしています。
=&
実際には2つの別個の演算子:=
と&
であるため、行はrp->p_flag = & ~SSWAP;
に相当します。
はbitwise NOT演算子なので、~SSWAP
はSSWAP
のビットを反転した結果になります。 & ~SSWAP
は、~SSWAP
という結果の参照になります。これはコンパイルエラーです。したがって、現代コンパイラ(C89以来)を使用してコンパイルすることはできませんが、=&
は最新のコンパイラでは&=
に相当します。
&=
はrp->p_flag
と~SSWAP
にbitwise ANDを適用し、rp->p_flag
に結果を配置します。最終的な結果はの0
ビットすべてがrp->p_flag
のそれぞれのビットをオフにすることです。これは、少なくとも1つの1
ビットがオフになる場合にのみ実行され、rp->p_flag
の値が操作の結果変更される場合は、aretu(u.u_ssav)
を呼び出すだけです。
Ehrm、実際に '&'が '='の直後に来るとき、それは単項演算子として使用されるので、それはアドレス演算子です。もちろん、一時的なアドレスを取ることは全く意味をなさないので、これはタイプミスであることが明らかであり、 '&='(これは1つの演算子です)が意味されていました。 – sepp2k
@ sepp2kあなたのコメントを読む直前に私に当たった。あなたが気にしないなら、私はこれを私の答えに組み込むつもりです。 – marcog
C89以降、演算子=&はもう存在しません。 &演算子のみが有効です。それ以前のCコンパイラではこれは実際には有効だったので、これは本当に初期のUNIXソースコードからのものです。 –
初期のCでは、代入演算子の右側に演算子がありました。したがって、&=
の代わりに=&
、+=
の代わりに=+
でした。
このコードは、特定のビットがセットされているかどうかをチェックし、そうであれば、アクションを実行してビットをオフにします。
あなたの若いwhippersnappersは遅すぎる生まれた:)
このコードは、Unix(前V7)の非常に初期のバージョンから来ています。冗談は、その上のコメントが"You are not supposed to understand this"であり、それがa bit of a legendになっているということです。 horse's mouthから
:
Bは、XにYを追加し、X = Y +を使用して、一般的な割当を 演算子を導入しました。 表記は、 TMGに取り込んだAlgol 68 [Wijngaarden 75](McIlroy経由)でした。 (Bおよび早期Cは、オペレータ 代わり+ =の= +綴られた、1976年修復この 間違いは、Bの字句 アナライザで 最初のフォームを処理する誘惑簡単な方法によって を誘導した。)
これはほんの少しのフリッパーですが、冗談は何ですか? –
ここから見てくださいhttp://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html私はコメントを削除しました –