提问人: 提问时间:10/29/2009 最后编辑:43 revs, 29 users 22%GManNickG 更新时间:11/2/2023 访问量:993077
C/C++中的“-->”运算符是什么?
What is the '-->' operator in C/C++?
问:
在阅读了 C++/STL 的隐藏功能和黑暗角落后,我完全惊讶于以下代码片段在 Visual Studio 2008 和 G++ 4.4 中编译和工作。我认为这也是有效的 C,因为它也适用于 GCC。comp.lang.c++.moderated
代码如下:
#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
这在标准中定义在哪里,它从何而来?
答:
-->
不是运算符。它实际上是两个独立的运算符,并且 .--
>
条件中的代码递减,同时返回 的原始(未递减)值,然后使用运算符将原始值进行比较。x
x
0
>
为了更好地理解,该语句可以写成如下:
while( (x--) > 0 )
评论
x--
while (x-- > 0)
它相当于
while (x-- > 0)
x--
(后递减)等价于 (但返回 的原始值 ),因此代码转换为:x = x-1
x
while(x > 0) {
x = x-1;
// logic
}
x--; // The post decrement done when x <= 0
评论
x--
绝不等同于 .x = x-1
--x
等价于 和 。 从我这里。x = x-1
x -=1
-1
x--
(x = x-1) + 1
它
#include <stdio.h>
int main(void) {
int x = 10;
while (x-- > 0) { // x goes to 0
printf("%d ", x);
}
return 0;
}
只是空间让事情看起来很有趣,减少和比较。--
>
这是一个非常复杂的运算符,因此即使是 ISO/IEC JTC1(联合技术委员会 1)也将其描述放在 C++ 标准的两个不同部分。
撇开玩笑不谈,它们是两个不同的运算符:分别在 C++03 标准的 §5.2.6/2 和 §5.9 中进行了描述。--
>
无论如何,我们现在有一个“去”运算符。 很容易被记住为一个方向,“而 X 归零”是意思直截了当的。"-->"
此外,它比某些平台更有效率。"for (x = 10; x > 0; x --)"
评论
for (size_t x=10; x-->0; )
++>
int
x
0
while (n--)
n
-->
的用法具有历史意义。在 x86 架构上,递减过去(在某些情况下仍然如此)比递增更快。使用暗示这将会,并吸引那些有数学背景的人。-->
-->
x
0
评论
LOOP <address>
ECX
<address>
ECX
LOOP
counter --> 0
counter
MOV ECX, value
@start:
<code>
LOOP @start
counter = value - 1; while (counter --> 0) { <code>; }
value
此代码首先比较 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
和 之间缺少空格。 是后递减的,即检查条件后递减。--
>
x
x>0 ?
评论
#define foo()
#define foo ()
假设在循环之前为正,则等价于:x
while (x --> 0)
while (x--)
评论
当我运行此代码时,我的编译器将打印出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--
x
while( x > 0 )
{
x--;
std::cout << x;
}
是写同一件事的不同方式。
不过,原版看起来像“当 x 变为 0”时,这很好。
评论
while( x-- > 0 ) actually means while( x > 0)
- 我不确定你想在那里说什么,但你表达的方式暗示没有任何意义,这显然是非常错误的。--
x
-1
x
0
--
是递减运算符,并且是大于运算符。>
这两个运算符作为单个运算符应用,如 。-->
评论
我读过的一本书(我记不清是哪本书)说:编译器尝试使用左右规则将表达式解析为最大的标记。
在本例中,表达式:
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
完全是极客,但我会用这个:
#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;
}
评论
atoi
或者对于完全不同的东西...... 滑动到 .x
0
while (x --\
\
\
\
> 0)
printf("%d ", x);
不是那么数学,但是......每张图片都描绘了千言万语......
实际上,正在减少,并且正在检查这种情况。不是,而是x
-->
(x--) > 0
注意:值在检查条件后更改,因为它在递减后。一些类似的情况也可能发生,例如:x
--> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0
评论
x
while ( (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
该规则本质上是从左到右,表达式是通过获取将形成有效令牌的最大字符来形成的。
评论
x
在 C++ 中,可以在相反的方向上更快地归零:
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() {
int x = 10;
while (x > 0) {
printf("%d ", x);
x = x - 1;
}
}
这只是上述内容的简写,只是一个正常的大于 。x--
>
operator
评论
The OP's way: 9 8 7 6 5 4 3 2 1 0
和The Garry_G way: 10 9 8 7 6 5 4 3 2 1
x=x-1
printf
x=x-1
x--
x--
while
我们用传统的方式在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
}
}
无论哪种方式,我们都做同样的事情,实现相同的目标。
评论
a--
a
-1
0
(x --> 0)
方法。(x-- > 0)
- 你可以使用
(x -->)
Output: 9 8 7 6 5 4 3 2 1 0
- 你可以使用 It's mean
(-- 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
同样,您可以尝试多种方法来成功执行此命令。
这根本不是运算符。我们有一个像 ,但不是 的运算符。这只是一个错误的解释,它只是意味着 x 具有后递减运算符,并且此循环将运行直到它大于零。-->
->
-->
while(x-- >0)
编写此代码的另一种简单方法是 .while 循环将在获得错误条件时停止,这里只有一种情况,即 .因此,当 x 值递减到零时,它将停止。while(x--)
0
这是一元后递减运算符。--
while (x-- > 0) // x goes to 0
{
printf("%d ", x);
}
- 一开始,条件将评估为
(x > 0) // 10 > 0
- 现在,由于条件为真,它将以递减的值进入循环
x-- // x = 9
- 这就是为什么第一个打印值是 9 的原因
- 等等。在最后一个循环中,所以条件为真。根据一元运算符,该值更改为打印时的值。
x=1
x = 0
- 现在,,它将条件评估为 false,while 循环退出。
x = 0
(x > 0 )
评论
--
-->
不是运算符,它是 (post-decrement) 和 (greater than comparison) 的并列。--
>
循环看起来更熟悉,如下所示:
#include <stdio.h>
int main() {
int x = 10;
while (x-- > 0) { // x goes to 0
printf("%d ", x);
}
}
此循环是一个经典的习惯用语,用于枚举(排除的上限)和包含的下限之间的值,可用于从最后一个到第一个遍历数组的元素。10
0
初始值是迭代总数(例如数组的长度),1 加上循环中使用的第一个值。是循环内部的最后一个值,因此注释 x 变为 0。10
0
x
请注意,循环完成后的值为 。x
-1
另请注意,如果具有无符号类型(例如 ),则此循环将以相同的方式运行,这与朴素替代方案相比具有很大的优势。x
size_t
for (i = length-1; i >= 0; i--)
出于这个原因,我实际上是这个令人惊讶的语法的粉丝:.我发现这个成语既醒目又优雅,就像 vs: 一样(看起来令人困惑地类似于 )。它也适用于其他语言,其语法受C启发:C++,Objective-C,java,javascript,C#等等。while (x --> 0)
for (;;)
while (1)
while (l)
这就是你的意思。
while((x--) > 0)
我们在童年时就听说过,
停止不要,放手 (روکو مت، جانے دو)
逗号造成混淆的地方
停下来,不要放手。(روکو، مت جانے دو)
现在在编程中也会发生同样的情况,空格会造成混乱。:D
评论
while((x --)> 0)
while (x --> 0)
x
0
x
您可以使用穿甲箭头运算符 (-->) 代替常规的箭头运算符:--x>(注意箭头尖端的锋利倒钩)。它为穿甲增加了 +1,因此它比普通箭头操作员更快地完成循环 1 迭代。自己试一试:
int x = 10;
while( --x> 0 )
printf("%d ", x);
评论
Extra Long Arrow
x ----> 0
Extra Long Armor Piercing Arrow
----x> 0
评论
-->