는 이러한 연산자의 기능 (= & ~) 무엇이 C 연산자를 설명 할 수,이 코드는 농담으로 게시 이 하나가
라는 제목의 발견 "초기 유닉스 소스에서 발견 :"
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
는 이러한 연산자의 기능 (= & ~) 무엇이 C 연산자를 설명 할 수,이 코드는 농담으로 게시 이 하나가
라는 제목의 발견 "초기 유닉스 소스에서 발견 :"
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
~
이 unary bitwise complement 인 FLI ps 비트 정수.
그러나 의견을 읽고 잘못된 코드를 읽은 후 실현 한 코드는 컴파일러로 컴파일되지 않습니다.
@Avi 덕분에 =&
연산자는 현재 &=
을 의미하지만이 구문은 실제로 현재의 C 표준보다 훨씬 앞서서 진정한 고대 UNIX 코드입니다.
정말 오늘을
address-of
운영자 역할을한다 여기
&
, 아닌 bitwise AND
연산자를 의미 할 것입니다 무엇입니까.
int main()
{
int x = 5;
int y = 2;
x =& ~y;
}
이 코드는 생성 할 것이다 컴파일 :
error: lvalue required as unary ‘&’ operand
난 정말 전사에 문제가 생각, 논리적으로, 그것은 &=
아닌 다른 방법으로해야한다.
실제로는 &=
인 경우에는 bitwise를하고 있습니다.
=&
은 실제로 두 개의 분리 연산자 인 =
과 &
이므로 줄은 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
비트가 꺼지면 실행되어 rp->p_flag
값이 작동의 결과로 변경되면 aretu(u.u_ssav)
만 호출 할 수 있습니다.
Ehrm, 실제로'&'가'= '바로 뒤에 올 때, 이것은 단항 연산자로 사용되므로 연산자의 주소가 * 비 * 비트가됩니다. 물론 임시 주소를 사용하는 것은 전혀 의미가 없으므로 오타가있는 것이 분명하고 '& ='(하나의 연산자)가 의미됩니다. – sepp2k
@ sepp2k 귀하의 의견을 읽기 전에 그것은 나를 때렸습니다. 네가 괜찮 으면, 나는 이것을 내 대답에 포함시킬 것이다. – marcog
C89 이후 연산자 = &는 더 이상 존재하지 않습니다. & 연산자 만 유효합니다. 이전의 C 컴파일러에서는 이것이 실제로 유효했기 때문에 이것은 초기 UNIX 소스 코드에서 나온 것입니다. –
초기 C에서 할당 연산자의 오른쪽에 연산자가있었습니다.따라서 &=
대신 =&
이고 +=
대신 =+
이되었습니다.
그래서이 코드는 특정 비트가 설정되어 있는지 확인하고, 그렇다면 조치를 취하여 비트를 끕니다.
당신 젊은 whippersnappers은 너무 늦게 태어났다 :
이 코드는 유닉스 (사전 V7)의 초기 버전에서 제공됩니다. 농담은 바로 위에있는 설명이 "You are not supposed to understand this"이고 a bit of a legend이되었다는 것입니다. horse's mouth 가입일
:
B는 X와 Y를 추가 = X + Y를 사용하여, 할당을 일반화 연산자를 도입했다. 표기법은 Algol 68 [Wijngaarden 75]에서 의 TMG에 통합 된 McIlroy를 통해 이루어졌습니다. (B 초기 C에서, 연산자 는 = + 대신 + =의 철자가되었다. 1976 년 수리이 실수, B의 어휘 분석기에서 제 폼 처리를 다루고, 간편한 방법으로 을 유도)
그건 약간의 플리퍼 야. 농담이 뭐야? –
여기에서 참조하십시오 http://www.bsdlover.cn/study/UnixTree/V6/usr/sys/ken/slp.c.html 코멘트를 삭제했습니다 –