什么是C ++中的“ – >”运算符?

comp.lang.c++.moderated阅读了C ++ / STL的隐藏特性和黑暗angular色后,我完全惊讶以下代码片段在Visual Studio 2008和G ++ 4.4中编译和工作。

代码如下:

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

我认为这是C,因为它也在GCC中工作。 标准在哪里定义,它来自哪里?

-->不是操作员。 它实际上是两个独立的操作符, -->

条件代码递减x ,同时返回x的原始值(非递减值),然后使用>运算符将原始值与0进行比较。

为了更好的理解,这个陈述可以写成如下:

 while( (x--) > 0 ) 

这是一个非常复杂的操作符,所以即使ISO / IEC JTC1(联合技术委员会1)也将其描述放在C ++标准的两个不同部分。

除了开玩笑,他们是两个不同的运算符: -->分别在C ++ 03标准的§5.2.6/ 2和§5.9中描述。

或者完全不同的东西… x幻灯片为0

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

不是那么的math,但是……每一幅画都描绘了千言万语……

这相当于

 while (x-- > 0) 

x可以在相反的方向上更快地变为零:

 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

;)

它的

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

只是空间使事情看起来很有趣, --减less和>比较。

-->的用法具有历史意义。 递减是(并且在某些情况下仍然是),比在x86架构上增加更快。 使用-->表明x将会变为0 ,并呼吁具有math背景的人。

 while( x-- > 0 ) 

是如何parsing。

我读过的一本书(我不太清楚哪本书)说: 编译器试图通过使用左边的规则来parsingexpression式到最大的标记

在这种情况下,expression式:

 x-->0 

parsing到最大的令牌:

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

相同的规则适用于这个expression式:

 a-----b 

parsing后:

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

我希望这有助于理解复杂的expression^^

完全怪胎,但我会用这个:

 #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; } 

这完全一样

 while (x--) { printf("%d ", x); } 

为非负数

无论如何,我们现在有一个“去”运营商。 "-->"很容易被记住作为一个方向,而“x去零”是直接的意思。

而且,在某些平台上,它比"for (x = 10; x > 0; x --)"更有效一些。

这个代码首先比较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 

当我运行这个代码时,我的编译器会打印出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”,这是很好的。

-->之间没有空格。 x是后减量,即检查条件x>0 ?后递减x>0 ?

--递减运算符, >大于运算符。

这两个运营商是一个单一的应用-->

实际上, x是后递减的,并且正在检查这个条件。 这不是--> ,它是(x--) > 0

注意:在检查条件之后, x值会发生变化,因为它是在后递减的。 一些类似的情况也可能发生,例如:

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

这是两个操作员的组合。 首先--用于递减值, >用于检查值是否大于右侧操作数。

 #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 

C和C ++服从“最大蒙克”规则。 a — b被转换为(a--) - b ,在你的情况下, x-->0转化为(x--)>0

规则说的本质是从左到右,expression式是通过取最大的字符形成一个有效的expression式来形成的。

为什么所有的并发症?

原始问题的简单答案只是:

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

做同样的事情。 不是说你应该这样做,但是它做同样的事情,并会在一个职位上回答这个问题。

x–只是上面的简写,而>只是一个普通的大于运算符。 没有大神秘!

现在有太多让简单的事情变得复杂的人了)

常规的方式,我们在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){ // Code a = a -1 // Decrement inside loop } } 

两种方式,我们做同样的事情,达到相同的目标。