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

Waz*_*ery 1 c operators

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

"在早期的Unix资源中找到:"

if(rp->p_flag & SSWAP) {
    rp->p_flag =& ~SSWAP;
    aretu(u.u_ssav);
}
Run Code Online (Sandbox Code Playgroud)

编辑:来源:http://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html

The*_*aul 6

你们这些年轻的自命不凡者出生得太晚了:)

该代码来自 Unix 的早期版本(V7 之前)。笑话是,上面的评论是“你不应该理解这个”,这已经成为一个传奇


wkl*_*wkl 5

~一元按位补码,它以整数形式翻转位.

但是,在阅读评论并意识到我错误地阅读了您的代码后,我意识到您提供的代码甚至无法在现代编译器中编译.

感谢@Avi:运算符=&意味着&=今天意味着什么,但这种语法确实早于当前的C标准,因此它是真正古老的UNIX代码.

今天真正意味着什么

&这里应该充当address-of运营商,而不是bitwise AND运营商.

int main()
{
    int x = 5;
    int y = 2;
    x =& ~y;
}
Run Code Online (Sandbox Code Playgroud)

编译此代码将产生:

error: lvalue required as unary ‘&’ operand

我真的认为转录存在问题,从逻辑上讲,它应该是&=而不是其他方式.

在实际情况下,那就是&=按位进行.

  • 但是例子是`=&`不是`&=` (2认同)
  • 在C早期,赋值运算符右侧有运算符.所以它是`=&`而不是`&=`,而`= +`而不是`+ =`. (2认同)
  • 他们改变了它,因为它是模棱两可的 - "x = -3"可能意味着"x = -3"或"减少x乘3". (2认同)

Avi*_*Avi 5

在早期的 C 中,赋值运算符的运算符位于右侧。所以它是=&代替&=,并且=+代替+=

因此,此代码只是检查是否设置了某个位,如果设置了,则采取行动并关闭该位。