在 comp.lang.c++.moderated
上阅读Hidden Features and Dark Corners of 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);
}
}
我假设这是C,因为它也适用于GCC . 标准中定义了哪里,它来自何处?
21 回答
运行此代码时,我的编译器将打印出9876543210 .
正如所料 .
while( x-- > 0 )
实际上意味着while( x > 0)
.x--
帖子递减x
.是一种不同的写作方式 .
虽然原来看起来像“虽然x变为0”但很好 .
x
可以在相反的方向上更快地变为零:8 6 4 2
你可以用箭头控制速度!
90 80 70 60 50 40 30 20 10
;)
它的
只是空间使事情看起来很有趣,
--
减少和>
比较 .为什么所有的并发症?
原始问题的简单答案就是:
做同样的事情 . 不是说你应该这样做,但它做同样的事情并且会在一篇文章中回答这个问题 .
x--
只是上述的简写,>
只是正常大于operator
. 没什么大不了的!现在有太多的人把简单的事情弄复杂了;)
是如何解析的 .
它相当于
x--
(减去后)相当于x = x-1
所以,代码转换为:--
是 decrement 运算符,>
是 greater-than 运算符 .这两个运算符作为单个运算符应用,如
-->
.此代码首先比较x和0,然后递减x . (也在第一个答案中说:你是后递减x然后将x和0与
>
运算符进行比较 . )请参阅此代码的输出:我们现在首先通过在输出中看到0进行比较然后递减 .
如果我们想先减少然后比较,请使用以下代码:
那个输出是:
--
和>
之间缺少空格 .x
后递减,即在检查条件x>0 ?
后递减 .C和C++遵守"maximum munch"规则 . 同样的方式a --- b被翻译为
(a--) - b
,在你的情况下x-->0
转换为(x--)>0
.规则本质上是从左到右,表达式是通过获取将形成有效表达式的最大字符来形成的 .
完全是极客,但我将使用这个:
它是两个运营商的组合 . 第一个
--
用于递减值,>
用于检查该值是否大于右侧操作数 .输出将是:
或者对于完全不同的东西... x幻灯片到0
不是那么数学,但......每张图片都描绘了千言万语......
-->
的用法具有历史意义 . 减少(在某些情况下仍然是),比在x86架构上递增更快 . 使用-->
表明x
将会0
,并吸引具有数学背景的人 .无论如何,我们现在有一个"goes to"运营商 .
"-->"
很容易被人们记住作为一个方向,"while x goes to zero"意思是直的 .此外,它在某些平台上比
"for (x = 10; x > 0; x --)"
更有效率 .实际上,
x
是后递减的,并且正在检查该条件 . 它不是-->
,它是(x--) > 0
注意:检查条件后,
x
的值会更改,因为它会后递减 . 也可能发生一些类似的情况,例如:条件代码递减
x
,同时返回x
的原始(未递减)值,然后使用>
运算符将原始值与0
进行比较 .To better understand, the statement could be written as follows:
这是一个非常复杂的操作员,所以即使ISO/IEC JTC1 (Joint Technical Committee 1)将其描述放在C标准的两个不同部分 .
开玩笑说,它们是两个不同的运算符:
--
和>
分别在C03标准的§5.2.6/ 2和§5.9中描述 .我读过的一本书(我记不清哪本书)说明了: Compilers try to parse expressions to the biggest token 使用左右规则 .
在这种情况下,表达式:
解析最大的代币:
The same rule 适用于此表达式:
解析后:
我希望这有助于理解复杂的表达式^^
这完全一样
对于非负数
我们在循环括号“
()
" and terminating condition inside the braces"{}
”中定义条件的常规方法,但是--
&>
是一次定义所有内容的方式 . 例如:它说,递减
a
并运行循环,直到a
大于0
其他方式应该是这样的:
两种方式,我们做同样的事情,实现相同的目标 .