질문자 :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
C 및 C++ 는 "최대 뭉크" 규칙을 따릅니다. (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)
의미합니다.
-
(x -->)
사용할 수 있습니다.
Output: 9 8 7 6 5 4 3 2 1 0
- 다음을 사용할 수 있습니다
(-- x > 0)
평균입니다 (--x > 0)
Output: 9 8 7 6 5 4 3 2 1
- 당신이 사용할 수있는
(--\ \ x > 0)
Output: 9 8 7 6 5 4 3 2 1
- 당신이 사용할 수있는
(\ \ x --> 0)
Output: 9 8 7 6 5 4 3 2 1 0
- 당신이 사용할 수있는
(\ \ x --> 0 \ \ )
Output: 9 8 7 6 5 4 3 2 1 0
- 당신은 또한 사용할 수 있습니다
( 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">