etc./StackOverFlow

C/C++에서 "-->" 연산자는 무엇입니까?

청렴결백한 만능 재주꾼 2021. 9. 23. 22:51
반응형

질문자 :Community Wiki


comp.lang.c++.moderated 에서 C++/STL의 숨겨진 기능 및 어두운 구석을 읽은 후 다음 코드 조각이 Visual Studio 2008 및 G++ 4.4에서 컴파일되고 작동한다는 사실에 완전히 놀랐습니다.

코드는 다음과 같습니다.

 #include <stdio.h> int main() { int x = 10; while (x --> 0) // x goes to 0 { printf("%d ", x); } }

산출:

 9 8 7 6 5 4 3 2 1 0

GCC에서도 작동하기 때문에 이것이 C라고 가정합니다. 이것은 표준에서 어디에서 정의되며 어디에서 왔습니까?



답변자 : Community Wiki


--> 연산자가 아닙니다. 실제로 두 개의 별도 연산자 --> 입니다.

조건의 코드는 x x 의 원래(감소되지 않은) 값을 반환 > 연산자를 사용하여 0

더 잘 이해하기 위해 진술은 다음과 같이 작성할 수 있습니다.

 while( (x--) > 0 )


답변자 : Community Wiki


또는 완전히 다른 것을 위해 ... x 0 슬라이드합니다.

 while (x --\ \ \ \ > 0) printf("%d ", x);

수학만큼은 아니지만... 모든 그림은 천 단어를 그립니다...



답변자 : Community Wiki


이것은 매우 복잡한 연산자이므로 ISO/IEC JTC1(Joint Technical Committee 1) 조차도 C++ 표준의 두 부분에 설명을 넣었습니다.

농담은 제쳐두고, 그것들은 두 개의 다른 연산자입니다. --> 는 C++03 표준의 §5.2.6/2 및 §5.9에 각각 설명되어 있습니다.



답변자 : Community Wiki


x 는 반대 방향으로 더 빨리 0으로 갈 수 있습니다.

 int x = 10; while( 0 <---- x ) { printf("%d ", x); }

8 6 4 2

화살표로 속도를 제어할 수 있습니다!

 int x = 100; while( 0 <-------------------- x ) { printf("%d ", x); }

90 80 70 60 50 40 30 20 10

;)



답변자 : Community Wiki


그것은 동등하다

 while (x-- > 0)

x-- POST (감소량)에 상당하는 x = x-1 이므로, 코드 변환에 :

 while(x > 0) { x = x-1; // logic } x--; // The post decrement done when x <= 0


답변자 : Community Wiki


이것의

 #include <stdio.h> int main(void) { int x = 10; while (x-- > 0) { // x goes to 0 printf("%d ", x); } return 0; }

공간만 있으면 사물이 웃기게 보입니다. -- 감소하고 > 비교합니다.



답변자 : Community Wiki


--> 은 역사적 관련성이 있습니다. 감소는 x86 아키텍처에서 증가하는 것보다 더 빨랐습니다(어떤 경우에는 여전히 그렇습니다). --> 사용하면 x 0 이 될 것이며 수학적 배경을 가진 사람들에게 어필합니다.



답변자 : Community Wiki


완전히 괴짜이지만 나는 이것을 사용할 것입니다 :

 #define as ;while int main(int argc, char* argv[]) { int n = atoi(argv[1]); do printf("n is %d\n", n) as ( n --> 0); return 0; }


답변자 : Community Wiki


while( x-- > 0 )

파싱하는 방법입니다.



답변자 : Community Wiki


내가 읽은 한 책(어떤 책인지 정확히 기억나지 않음)은 다음과 같이 말했습니다. 컴파일러는 왼쪽 오른쪽 규칙을 사용하여 표현식을 가장 큰 토큰으로 구문 분석하려고 합니다.

이 경우 표현식은 다음과 같습니다.

 x-->0

가장 큰 토큰으로 구문 분석:

 token 1: x token 2: -- token 3: > token 4: 0 conclude: x-- > 0

이 표현식에도 동일한 규칙이 적용됩니다.

 a-----b

구문 분석 후:

 token 1: a token 2: -- token 3: -- token 4: - token 5: b conclude: (a--)-- - b

복잡한 표현을 이해하는데 도움이 되었으면 합니다^^



답변자 : Community Wiki


이것은 정확히 동일합니다

 while (x--)


답변자 : Community Wiki


어쨌든, 우리는 이제 "go to" 연산자를 가지고 있습니다. "-->" 는 방향으로 기억하기 쉽고 "x가 0이 되는 동안"은 의미가 직설적입니다.

또한 일부 플랫폼 "for (x = 10; x > 0; x --)" 보다 조금 더 효율적입니다.



답변자 : Community Wiki


이 코드는 먼저 x와 0을 비교한 다음 x를 감소시킵니다. (또한 첫 번째 답변에서 다음과 같이 말했습니다. x를 사후 감소한 다음 x와 0을 > 연산자와 비교합니다.) 이 코드의 출력을 참조하세요.

 9 8 7 6 5 4 3 2 1 0

이제 먼저 비교한 다음 출력에서 0을 보고 감소합니다.

먼저 감소시킨 다음 비교하려면 다음 코드를 사용하십시오.

 #include <stdio.h> int main(void) { int x = 10; while( --x> 0 ) // x goes to 0 { printf("%d ", x); } return 0; }

해당 출력은 다음과 같습니다.

 9 8 7 6 5 4 3 2 1


답변자 : Community Wiki


이 코드를 실행하면 컴파일러에서 9876543210을 출력합니다.

 #include <iostream> int main() { int x = 10; while( x --> 0 ) // x goes to 0 { std::cout << x; } }

예상대로. while( x-- > 0 ) 실제로 while( x > 0) 합니다. x-- post는 x 감소시킵니다.

 while( x > 0 ) { x--; std::cout << x; }

같은 것을 다른 방식으로 쓰는 것입니다.

그래도 원본이 "x가 0이 되는 동안"처럼 보이는 것이 좋습니다.



답변자 : Community Wiki


--> 사이에 공백이 있습니다. x 는 사후 감소, 즉 x>0 ? .



답변자 : Community Wiki


--감소 연산자이고 >보다 큼 연산자입니다.

--> 와 같이 단일 연산자로 적용됩니다.



답변자 : Community Wiki


두 연산자의 조합입니다. 첫 번째 -- 값을 감소시키기 위한 것이고 > 는 값이 오른쪽 피연산자보다 큰지 확인하기 위한 것입니다.

 #include<stdio.h> int main() { int x = 10; while (x-- > 0) printf("%d ",x); return 0; }

출력은 다음과 같습니다.

 9 8 7 6 5 4 3 2 1 0


답변자 : Community Wiki


실제로 x 는 사후 감소이며 해당 조건을 확인하고 있습니다. --> 가 아니라 (x--) > 0

참고: x 값은 사후 감소하기 때문에 조건이 확인된 후에 변경됩니다. 다음과 같은 몇 가지 유사한 경우도 발생할 수 있습니다.

 --> x-->0 ++> x++>0 -->= x-->=0 ++>= x++>=0


답변자 : Community Wiki


CC++ 는 "최대 뭉크" 규칙을 따릅니다. (a--) - b b 로 변환되는 것과 같은 방식으로, 귀하의 경우 x-->0 (x--)>0 변환됩니다.

규칙이 본질적으로 말하는 것은 왼쪽에서 오른쪽으로 이동하여 유효한 표현을 형성할 최대 문자를 취함으로써 표현이 형성된다는 것입니다.



답변자 : Community Wiki


왜 모든 합병증?

원래 질문에 대한 간단한 대답은 다음과 같습니다.

 #include <stdio.h> int main() { int x = 10; while (x > 0) { printf("%d ", x); x = x-1; } }

동일한 작업을 수행합니다. 나는 당신이 이런 식으로해야한다고 말하는 것이 아니라 같은 일을하고 한 게시물에서 질문에 대답했을 것입니다.

x-- 는 위의 줄임말이고 > 는 일반적인 보다 큼 operator 입니다. 큰 미스터리는 없다!

요즘은 간단한 걸 복잡하게 만드는 사람들이 너무 많아요;;



답변자 : Community Wiki


우리가 while 루프 괄호" () {} " 안에 조건을 종료 -- & > 는 한 번에 모두 정의하는 방식입니다. 예를 들어:

 int abc(){ int a = 5 while((a--) > 0){ // Decrement and comparison both at once // Code } }

그것은 감소 말한다 a 하고 시간까지 루프를 실행 a 보다 큰 0

다른 방법은 다음과 같아야 합니다.

 int abc() { int a = 5; while(a > 0) { a = a -1 // Decrement inside loop // Code } }

두 가지 방법으로, 우리는 같은 일을 하고 같은 목표를 달성합니다.



답변자 : Community Wiki


(x --> 0)(x-- > 0) 의미합니다.

  1. (x -->) 사용할 수 있습니다.
    Output: 9 8 7 6 5 4 3 2 1 0
  1. 다음을 사용할 수 있습니다 (-- x > 0) 평균입니다 (--x > 0)
    Output: 9 8 7 6 5 4 3 2 1
  1. 당신이 사용할 수있는
 (--\ \ x > 0)

Output: 9 8 7 6 5 4 3 2 1

  1. 당신이 사용할 수있는
 (\ \ x --> 0)

Output: 9 8 7 6 5 4 3 2 1 0

  1. 당신이 사용할 수있는
 (\ \ x --> 0 \ \ )

Output: 9 8 7 6 5 4 3 2 1 0

  1. 당신은 또한 사용할 수 있습니다
 ( x --> 0 )

Output: 9 8 7 6 5 4 3 2 1 0

마찬가지로 이 명령을 성공적으로 실행하기 위해 많은 방법을 시도할 수 있습니다.



답변자 : Community Wiki


char sep = '\n' /1\ ; int i = 68 /1 \ ; while (i --- 1\ \ /1/1/1 /1\ /1\ /1\ /1\ /1\ / 1\ / 1 \ / 1 \ / 1 \ /1 /1 \ /1 /1 \ /1 /1 /1/1> 0) std::cout \ <<i<< sep;

더 큰 숫자의 경우 C++20에는 몇 가지 고급 루핑 기능이 도입되었습니다. i 를 잡기 위해 역루프를 구축하고 std::ostream 편향시킬 수 있습니다. i 의 속도는 구현에 따라 정의되므로 새로운 C++20 속도 연산자 <<i<< 를 사용하여 속도를 높일 수 있습니다. 우리는 또한 우리가하지 않으면, 벽을 구축하여 잡을 수 있어야 i 범위를 떠나 참조 드 그것은 정의되지 않은 동작이 발생합니다. 구분 기호를 지정하려면 다음을 사용할 수 있습니다.

 std::cout \ sep

거기에 67에서 1로의 for 루프가 있습니다.



답변자 : Community Wiki


일반 화살표 연산자(-->) 대신 갑옷 관통 화살표 연산자 --x>를 사용할 수 있습니다(화살표 끝에 있는 날카로운 가시에 주의). 갑옷 피어싱에 +1을 추가하므로 일반 화살표 연산자보다 빠르게 루프 1 반복을 완료합니다. 직접 시도해 보세요:

 int x = 10; while( --x> 0 ) printf("%d ", x);


답변자 : Community Wiki


여기 -- 단항 사후 감소 연산자입니다.

 while (x-- > 0) // x goes to 0 { printf("%d ", x); }
  • 처음에 조건은 (x > 0) // 10 > 0
  • 이제 조건이 참이므로 감소된 값 x-- // x = 9
  • 이것이 첫 번째 인쇄 값이 9인 이유입니다.
  • 등등. 마지막 루프 x=1 에서 조건은 true입니다. 단항 연산자에 따라 값은 인쇄 시 x = 0
  • 이제 x = 0 , 조건 (x > 0 ) 을 false로 평가하고 while 루프가 종료됩니다.


답변자 : Community Wiki


이것은 --> 연산자가 아닙니다. 우리는 같은 연산자를 가지고 -> 아니지만 같은 --> . 그것은 단순히 x에 사후 감소 연산자가 있고 이 루프는 0 while(x-- >0) 의 잘못된 해석입니다.

이 코드를 작성하는 또 다른 간단한 방법은 while(x--) 입니다. while 루프는 거짓 조건을 얻을 때마다 중지되며 여기에는 단 하나의 경우(예: 0 있습니다. 따라서 x 값이 0 으로 감소하면 중지됩니다.



답변자 : Community Wiki


사실, 당신은 단지 재미를 위해 --> 연산자를 "생성"할 수 있습니다)

 class MyClass { class Helper { MyClass* ptr; Helper(MyClass* _this): ptr{_this} {} public: Helper(const Helper&) = delete; Helper(Helper&&) = delete; void operator=(const Helper&) = delete; void operator=(Helper&&) = delete; operator MyClass() { auto tmp = *ptr; tmp._value++; return tmp; } friend MyClass; void operator>(int){std::cout << "Operator -->" << std::endl;} }; int _value = 0; public: MyClass() = default; MyClass(int value): _value{value} {} Helper operator--(int) { _value--; return Helper(this); } int get() const noexcept { return _value; } bool operator>(int num) const noexcept { return _value > num; } }; int main() { MyClass obj(5); obj > 1; //operator > obj--; //operator -- MyClass b = obj--; //still works std::cout << b.get() << std::endl; //4 std::cout << obj.get() << std::endl; //3 b --> 5; //operator --> //But there is at least one problem auto c = obj--; //auto can deduce a private type :( }

하지만 내가 말했듯이 그것은 단지 재미를 위한 것입니다 ;)



답변자 : Community Wiki


--> 는 연산자가 아니라 -- (사후 감소)와 > (비교보다 큼)의 병치입니다.

루프는 다음과 같이 더 친숙해 보일 것입니다.

 #include <stdio.h> int main() { int x = 10; while (x-- > 0) { // x goes to 0 printf("%d ", x); } }

10 (제외된 상한)과 0 (포함된 하한) 사이의 값을 열거하는 고전적인 관용구로, 마지막에서 첫 번째까지 배열의 요소를 반복하는 데 유용합니다.

초기 값 10 은 총 반복 횟수(예: 배열의 길이)이고 1에 루프 내에서 사용된 첫 번째 값을 더한 값입니다. 0 은 루프 내에서 x 의 마지막 값 이므로 주석 x는 0이 됩니다.

루프가 완료된 후 x 의 값 -1 입니다.

또한 이 루프는 x size_t 와 같은 부호 없는 유형 이 있는 경우 동일한 방식으로 for (i = length-1; i >= 0; i--) 순진한 대안보다 강력한 이점입니다.

이러한 이유로 저는 사실 이 놀라운 구문의 팬입니다: while (x --> 0) . for (;;) vs: while (1) while (l) 과 혼동될 정도로 유사해 보임)과 같이 눈길을 끌고 우아하다는 것을 알았습니다. 또한 C++, Objective-C, java, javascript, C#에서 영감을 받은 구문을 사용하는 다른 언어에서도 작동합니다.



답변자 : Community Wiki


그게 당신이 의미하는 것입니다.

 while((x--) > 0)

우리는 어린 시절에 들었습니다.

Stop don't Let Go (روکو مت، جانے دو)

쉼표가 혼동을 일으키는 곳

그만, 놓지 마. (روکو، مت جانے دو)

프로그래밍에서도 동일한 일이 발생합니다. SPACE는 혼란을 일으키고 있습니다. :NS



출처 : Here


출처 : http:www.stackoverflow.com/questions/1642028/what-is-the-operator-in-c-c">

반응형