GMa*_*ckG 8590 c++ code-formatting standards-compliance operators
看完后隐藏功能和C++/STL的暗角上comp.lang.c++.moderated
,我完全惊讶的是,下面的代码片断编译并在两个Visual Studio 2008和G ++ 4.4的工作.
这是代码:
#include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Run Code Online (Sandbox Code Playgroud)
我假设这是C,因为它也适用于GCC.标准中定义了哪里,它来自何处?
Cha*_*via 8261
-->
不是运营商.它实际上是两个独立的运营商,--
而且>
.
条件的代码递减x
,同时返回x
原始(未递减)值,然后0
使用>
运算符比较原始值.
为了更好地理解,该声明可以写成如下:
while( (x--) > 0 )
Run Code Online (Sandbox Code Playgroud)
uns*_*zed 2911
或者对于完全不同的东西...... x幻灯片到0
while (x --\
\
\
\
> 0)
printf("%d ", x);
Run Code Online (Sandbox Code Playgroud)
不是那么数学,但......每张图片都描绘了千言万语......
Kir*_*sky 2334
这是一个非常复杂的操作员,所以即使ISO/IEC JTC1(联合技术委员会1)也将其描述放在C++标准的两个不同部分.
开玩笑一边,它们是两个不同的运营商:--
和>
分别在§5.2.6/ 2和C++ 03标准的§5.9中描述.
Jay*_*ggs 1243
它相当于
while (x-- > 0)
Run Code Online (Sandbox Code Playgroud)
x--
(post decrement)相当于x = x-1
,代码转换为:
while(x > 0) {
x = x-1;
// logic
}
Run Code Online (Sandbox Code Playgroud)
doc*_*doc 1117
x
在相反的方向上可以更快地变为零:
int x = 10;
while( 0 <---- x )
{
printf("%d ", x);
}
Run Code Online (Sandbox Code Playgroud)
8 6 4 2
你可以用箭头控制速度!
int x = 100;
while( 0 <-------------------- x )
{
printf("%d ", x);
}
Run Code Online (Sandbox Code Playgroud)
90 80 70 60 50 40 30 20 10
;)
Rag*_*geZ 534
它的
#include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d ", x);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只是空间使事物看起来很有趣,--
减少和>
比较.
Mat*_*ner 414
用法-->
具有历史意义.减少(在某些情况下仍然是),比在x86架构上递增更快.使用-->
表明,x
将要0
,并呼吁那些有数学背景.
Esc*_*alo 348
非常极客,但我将使用这个:
#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;
}
Run Code Online (Sandbox Code Playgroud)
Ngu*_*Dat 310
我读过的一本书(我不记得哪本书正确)说明:编译器尝试使用左右规则将表达式解析为最大的标记.
在这种情况下,表达式:
x-->0
Run Code Online (Sandbox Code Playgroud)
解析最大的代币:
token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0
Run Code Online (Sandbox Code Playgroud)
同样的规则适用于此表达式:
a-----b
Run Code Online (Sandbox Code Playgroud)
解析后:
token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b
Run Code Online (Sandbox Code Playgroud)
我希望这有助于理解复杂的表达式^^
Goo*_*son 263
这完全一样
while (x--)
{
printf("%d ", x);
}
Run Code Online (Sandbox Code Playgroud)
对于非负数
Tes*_*est 236
无论如何,我们现在有一个"去"操作员."-->"
很容易被人们记住作为一个方向,而"当x变为零"意味着直接.
此外,它比"for (x = 10; x > 0; x --)"
某些平台更有效.
Saj*_*ani 216
此代码首先比较x和0,然后递减x.(也在第一个答案中说:你是后递减x,然后将x和0与>
运算符进行比较.)请参阅此代码的输出:
9 8 7 6 5 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)
我们现在首先通过在输出中看到0进行比较然后递减.
如果我们想先减少然后比较,请使用以下代码:
#include <stdio.h>
int main(void)
{
int x = 10;
while( --x> 0 ) // x goes to 0
{
printf("%d ", x);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那个输出是:
9 8 7 6 5 4 3 2 1
Run Code Online (Sandbox Code Playgroud)
Sto*_*son 172
运行此代码时,我的编译器将打印出9876543210.
#include <iostream>
int main()
{
int x = 10;
while( x --> 0 ) // x goes to 0
{
std::cout << x;
}
}
Run Code Online (Sandbox Code Playgroud)
正如所料.在while( x-- > 0 )
实际意义while( x > 0)
.该x--
职位递减x
.
while( x > 0 )
{
x--;
std::cout << x;
}
Run Code Online (Sandbox Code Playgroud)
是一种不同的写作方式.
很好,原来看起来像"虽然x变为0".
小智 143
--
和之间缺少空间>
.x
后递减,即在检查条件后递减x>0 ?
.
Raj*_*Das 126
它是两个运营商的组合.第--
一个用于递减值,>
用于检查该值是否大于右侧操作数.
#include<stdio.h>
int main()
{
int x = 10;
while (x-- > 0)
printf("%d ",x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出将是:
9 8 7 6 5 4 3 2 1 0
Run Code Online (Sandbox Code Playgroud)
And*_*ner 119
实际上,x
是后递减,并且正在检查该条件.它不是-->
,它是(x--) > 0
注意:x
在检查条件后更改值,因为它会后递减.也可能发生一些类似的情况,例如:
--> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0
Run Code Online (Sandbox Code Playgroud)
Gar*_*y_G 27
为什么所有的并发症?
原始问题的简单答案就是:
#include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d ", x);
x = x-1;
}
}
Run Code Online (Sandbox Code Playgroud)
做同样的事情.不是说你应该这样做,但它做了同样的事情,并且会在一篇文章中回答这个问题.
这x--
只是上述的简写,>
只是一个正常的大于operator
.没什么大不了的!
现在有太多的人把简单的事情弄复杂了;)
小智 25
传统的方式我们定义的条件,而循环括号" while
'和终止条件的括号内’ ()
",但这{}
与-->
一个办法一个定义的一次.例如:
int abc(void)
{
int a = 5
while((a--) > 0) // Decrement and comparison both at once
{
// Code
}
}
Run Code Online (Sandbox Code Playgroud)
它说,减少a
并运行循环直到时间a
大于0
其他方式应该是这样的:
int abc(void)
{
int a = 5;
while(a > 0)
{
a--;
// Code
}
a--;
}
Run Code Online (Sandbox Code Playgroud)
两种方式,我们做同样的事情,实现相同的目标.
Kal*_*ana 23
(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)
Run Code Online (Sandbox Code Playgroud)
Output: 9 8 7 6 5 4 3 2 1
(\
\
x --> 0)
Run Code Online (Sandbox Code Playgroud)
Output: 9 8 7 6 5 4 3 2 1 0
(\
\
x --> 0
\
\
)
Run Code Online (Sandbox Code Playgroud)
Output: 9 8 7 6 5 4 3 2 1 0
(
x
-->
0
)
Run Code Online (Sandbox Code Playgroud)
Output: 9 8 7 6 5 4 3 2 1 0
同样,您可以尝试多种方法来成功执行此命令。
小智 20
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;
Run Code Online (Sandbox Code Playgroud)
对于更大的数字,C++20 引入了一些更高级的循环功能。首先,i
我们可以构建一个反向循环去循环并将其偏转到std::ostream
. 但是,速度i
是实现定义的,因此我们可以使用新的 C++20 速度运算符<<i<<
来加快速度。我们还必须通过构建 wall 来捕捉它,如果我们不这样做,i
就会离开作用域并取消引用它会导致未定义的行为。要指定分隔符,我们可以使用:
std::cout \
sep
Run Code Online (Sandbox Code Playgroud)
我们有一个从 67 到 1 的 for 循环。
-->
不是运算符,它是--
(后减)和>
(大于比较)的并置。
该循环看起来会更熟悉:
#include <stdio.h>
int main() {
int x = 10;
while (x-- > 0) { // x goes to 0
printf("%d ", x);
}
}
Run Code Online (Sandbox Code Playgroud)
此循环是枚举10
(排除的上限)和0
包含的下限之间的值的经典习惯用法,对于从最后一个到第一个迭代数组的元素很有用。
初始值10
是迭代总数(例如数组的长度),加上循环内使用的第一个值。这是循环内0
的最后一个值,因此注释x 变为 0。x
x
请注意,循环完成后的值为-1
。
另请注意,如果具有无符号类型(例如 ) ,则此循环将以相同的方式运行,这比简单的替代方案具有很大的优势。x
size_t
for (i = length-1; i >= 0; i--)
出于这个原因,我实际上很喜欢这种令人惊讶的语法:while (x --> 0)
. 我发现这个习语引人注目且优雅,就像for (;;)
vs: while (1)
(看起来与 令人困惑地相似while (l)
)。它也适用于语法受 C 启发的其他语言:C++、Objective-C、java、javascript、C# 等。
小智 8
您可以使用穿甲箭头运算符来代替常规箭头运算符 (-->):--x>(注意箭头尖端上的那些尖锐倒钩)。它为穿甲加 1,因此它比常规箭头运算符更快地完成循环 1 迭代。自己试试:
int x = 10;
while( --x> 0 )
printf("%d ", x);
Run Code Online (Sandbox Code Playgroud)
这-->
根本就不是一个运营商。我们有一个运算符 like ->
,但没有 like -->
。这只是一个错误的解释,while(x-- >0)
它仅仅意味着 x 具有后减运算符,并且该循环将运行直到它大于零。
编写此代码的另一种简单方法是while(x--)
. while 循环只要得到一个 false 条件就会停止,这里只有一种情况,即0
。因此,当 x 值递减至零时,它将停止。
这--
是一元后减运算符。
while (x-- > 0) // x goes to 0
{
printf("%d ", x);
}
Run Code Online (Sandbox Code Playgroud)
(x > 0) // 10 > 0
x-- // x = 9
x=1
,所以条件为真。根据一元运算符,该值x = 0
在打印时更改为。x = 0
,它将条件评估(x > 0 )
为 false 并且while循环退出。 归档时间: |
|
查看次数: |
751067 次 |
最近记录: |