任何人都可以解释这些c运算符

时间:2010-12-26 20:58:48

标签: c operators

这些操作符的功能是什么(=&,〜),我发现这段代码是一个笑话,标题为

  

“在早期的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 个答案:

答案 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)

来自horse's mouth

  

B引入了广义赋值   运算符,使用x = + y将y添加到x。   符号来自Algol 68   [Wijngaarden 75]来自McIlroy,曾经   将其纳入他的版本   TMG。 (在B和C的早期,操作员   拼写= +而不是+ =;这个   错误,1976年修复,被诱导   通过诱人的简单处理方式   B的词汇中的第一种形式   分析器。)