这些操作符的功能是什么(=&,〜),我发现这段代码是一个笑话,标题为
“在早期的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
答案 0 :(得分:5)
~
是unary bitwise complement,它会翻转整数位。
然而,在阅读评论并意识到我错误地阅读了您的代码之后,我意识到您提供的代码甚至无法在现代编译器中编译。
感谢@Avi:运算符=&
表示今天&=
的意思,但这种语法确实早于当前的C标准,因此它是真正古老的UNIX代码。
今天真正意味着什么
&
此处应作为address-of
运算符,而不是bitwise AND
运算符。
int main()
{
int x = 5;
int y = 2;
x =& ~y;
}
编译此代码会产生:
error: lvalue required as unary ‘&’ operand
我真的认为转录存在问题,逻辑上应该是&=
而不是其他方式。
如果它实际上是&=
,那么它正在做一个按位和。
答案 1 :(得分:4)
在早期的C中,赋值运算符右侧有运算符。因此,=&
代替&=
,而=+
代替+=
。
因此,此代码只检查是否设置了某个位,如果是,则执行操作并关闭该位。
答案 2 :(得分:3)
你们年轻的鞭挞者出生太晚了:)
此代码来自Unix的早期版本(V7之前版本)。笑话是它上面的评论是"You are not supposed to understand this",已成为a bit of a legend。
答案 3 :(得分:1)
=&
实际上是两个独立的运算符:=
和&
,因此该行等同于rp->p_flag = & ~SSWAP;
。
~
是bitwise NOT运算符,因此~SSWAP
将会翻转SSWAP
的位。 & ~SSWAP
将导致引用~SSWAP
的结果,这是一个编译错误。所以事情不会使用现代编译器编译(因为C89),但=&
相当于现代编译器上的&=
。
&=
应用rp->p_flag
和~SSWAP
上的bitwise AND,并将结果放在rp->p_flag
中。最终结果是0
中的所有SSWAP
位将关闭rp->p_flag
中的相应位(如果已设置)。只有在关闭至少一个1
位时才会执行此操作,以便仅在aretu(u.u_ssav)
的值因操作而发生变化时才调用rp->p_flag
。
答案 4 :(得分:1)
B引入了广义赋值 运算符,使用x = + y将y添加到x。 符号来自Algol 68 [Wijngaarden 75]来自McIlroy,曾经 将其纳入他的版本 TMG。 (在B和C的早期,操作员 拼写= +而不是+ =;这个 错误,1976年修复,被诱导 通过诱人的简单处理方式 B的词汇中的第一种形式 分析器。)