在阅读了Edcx1(0)中C++/STL的隐藏特性和暗角之后,我完全惊讶于在Visual Studio 2008和G++ 4.4中编译和工作了下面的片段。
代码如下:
1 2 3 4 5 6 7 8 9
| #include <stdio.h>
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d", x);
}
} |
我假设这是C,因为它也适用于GCC。这在标准中是在哪里定义的,它是从哪里来的?
- 或者只是适当的间距…我不认为我以前见过变量和++或--之间的空间…
- 当我看到"/*"和"/"运算符时,我也非常惊讶,我在想这行"i/100*/=n;"是为什么计算的?
- 此"转到"运算符可以恢复(0<--x)。还有一个"运行到"操作符(0<----x)。Geez,这是我听过的最有趣的C++语法=)+ 1的问题。
- 有趣的是,虽然解释是非常错误的,但它确实描述了代码的正确操作。:)
- 伟大的现代化者:它在C(有混乱的空间)中完美地工作!
- 哦,不,使用"->"运算符时要小心。rValue必须小于lValue,否则可能会出现循环溢出:)
- 我对VS2008的一个恼怒是它的自动重新格式化在错误的地方打破了这个习惯用法。
- 想象一下新的语法可能性:#define upto ++<,#define downto -->。如果你感到邪恶,你可以做#define for while(和#define do ) {和#define done ;}并写for x downto 0 do printf("%d\
", x) done哦,人类……
- 埃里克·利珀特从中得到了一个愚人节的笑话:blogs.msdn.com/ericlippet/archive/2010/04/01/&hellip;
- 我想通过编写(int x=10;x>0;--x)来保存行和范围x。
- 有趣的是,它仍然执行了十次,这可能就是为什么书中的原文是这样放在一起的,以表明如果你只是简单地倒数,那么使用这个特定的语法可能会更有趣。
- @sadsido我想你的"运行到"操作符0 <---- x将不起作用,因为post/prefix递增/递减操作符不产生必要的lvalue。不过,变体不错!
- @sadsido,回复的"operator"没有按预期工作,因为x在循环中永远不会到达0。
- 打开了一种全新的表达方式编码的可能性,值得牺牲一些编译器警告:bool checknegative(int x)return x<0?真:—(假);
- 你可以把#define lim while和lim(x --> 0) printf("%d", x);写成"x接近于零时的极限"(当然,在最后一次迭代x == 0时,它并不完全等同于数学极限…我想我很感激,这样人们在现实生活中就不会这么做了。
- 您还可以同时使用两个x方法0,以2倍的速度倒数。while( x --> 0 <-- x )将按2步倒计时。
- 这通常与->[structure pointer]操作符混淆,但这是[bodmas][en.wikipedia.org/wiki/order_of_operations]最重要的地方。对于编译器,它应该是这样的:虽然(x->0),但是对于人类来说,它应该是这样记录的:虽然((x->0)仍然是ai超过了:)
- 这让我肚子疼。起初我以为我缺少了一些新的C++ 11特性。请不要这样做——97%试图阅读和理解您的代码的人不会知道这一技巧,并且会浪费时间试图弄明白它。X->0的可读性更高。此外,int x=0;while(x-->10);不"转到"10(在32位机器上减去约40亿后除外)。
- @斯蒂芬穆勒:我相信你的提议是一种未定义的行为——在没有序列点的情况下多次修改同一个变量
- @如果你是对的,我测试了代码,但显然不是很好,因为当我现在尝试时,它给出了错误。我的错。
- 它应该是关闭的,以避免在顶部答案中持续的微小变化。我看不到实现这一目标的其他方法。
- 在这一点上,这是一个城市传奇。我在书、杂志、网络等中看到过它。我认为它甚至通常都有一条关于某人对它的编译感到惊讶的线,并且总是在后面有一个解释它的挑战。
- "predec /增量的johanbezem返回左值。我认为代码是破碎的原因可能是更糟:在编译时不应返回的类型,而在运行时,由于与UB到该对象的修改进行多点之间没有任何序列
- "斯科特"这样一些subtracts后4到32位机,在线上有符号整数",或是underflow UB。
- 这不是一个C代码从代码的ANSI C编译器,但是大部分工作在线。在C,空参数列表不是一个操作系统,是不允许int main()NOR NOR C11 C99的ANSI C。但是K &;R—C本可以有一个。
- 12431234123412341234123 UB",它不是均不会发生。在_ min = int int x;X;尽管有人和国有企业之间,发生的最practically在线平台。这是一个具有挑战性的发现是,有没有exhibit相同的行为。但那是我最接近和在它前面的课程(x = 0)是不大于10 0操作系统将运行在环体的时代,不是4亿。它不是甚至有机会到underflow。所以这是我的废话"的时刻。但我的代码是:原始点是比kitschy可读的代码。
- 斯科特:"当然会为它和它的运行时间,这是不容易的可读性。但我是有符号整数,underflow(也在也在整数溢出的一步。该平台可以使问题的根据和溢出是与海湾合作委员会(与O2或高(x86和AMD64)的在线平台,一个企业最常用),这个问题也7682477 stackoverflow.com /问题/ / & hellip;
- parenthetical叹息如此多的讨论上的发言。也许我应该说"可能"或"常用"或",虽然这是不确定的行为。"
- "阿尔贝,谢谢你。我只是认为这是谁的东西,有一个严重的错误,如果你的东西与你的选择在这个unreadable for环?
- 我不明白为什么有这么多的关注这一问题。它只是一个标准的运营商和相关的优先位confusing仅仅是由于罕见的newbies放置空间的性质。但那是所有的。
-->不是一个运算符。它实际上是两个独立的操作符,--和>。
条件的代码在返回x的原始(未递减)值的同时递减x,然后使用>运算符将原始值与0进行比较。
为了更好地理解,该声明可以写如下:
- 同样,它看起来有点像那种上下文中的某种范围运算符。
- 如果x是后减后的,然后与0比较,这与x是后减后与0比较一样。
- 我认为先比较后减量——x>0先减量,然后比较
- 我觉得不一样。我认为单词"then"意味着有一个顺序(在后减量之后,x的值会少一个)。我想你可以说"你是在将x后减,然后比较它的旧值和0…",以使它更清楚。但无论如何,这都是吹毛求疵。我们都知道这是什么意思。
- 在Java中,它也编译:
- 请注意,当退出while循环时,x将包含-1,而不是0。这是因为当当前值为0或更小时循环将中断,然后此值将递减。此外,您正从"上方"接近0,因此您将达到0,递减和中断。如果x从0以下开始,它将简单地递减,永远不会进入循环。
- 我想到的第一件事是"什么?这是一个有趣的C++语法糖来表达PTR **,但是它后面有0个…
- 符号->经常被更纯粹的数学程序员使用,我甚至听说它被称为"倾向",因为这实际上是它在许多情况下被使用的行为。关于--),这是垂直双圈笑脸……;d或predecrement banana,以您喜欢的为准:d
- imho"为了更好地理解,声明可以如下:"while (x > 0) { x--; printf("%d", x); }或者更好:for循环。
- @Sellibitze和Knittl,更不用说post 3地址代码生成优化仍然是可能的,存储/加载可以以任何顺序移动,只要它不改变一个线程的可观察行为。在编译器级别和CPU级别(OOO)也是如此。因此,虽然在虚拟C++机级别上的修正是正确的,但在实践中却是错误的。
- 由于while循环将在x=0停止,因此不需要> 0 。
- 有趣的是它不是一个接线员,但是它有名字吗?还是我们只能称之为箭的东西?
- 它的名字@jay是一种糟糕的编程风格:-)这一点可以从问题最初被问到的事实中得到证明。用文本方式将运算符绑定到它们正在操作的对象上比用无关的对象更为合理,因此while (x-- > 0)将更为合适。它还使所发生的事情更为明显(至少在固定字体编辑器中),这意味着不需要此答案中的括号。
- 注意,我不是说你必须在运算符和操作数(如a+b)之间留出空格,只是它们不应给出不平衡的优先权(a+ b或a +b或不正确的优先权(如问题中所述),或char* x, y(即char指针和char,因此最好写为char *x, y或char y,*x)to避免可能的混淆)。
- int x=0;int y=10;do printf("%d",-x);while(-y<--x);不太好,因为需要否定x和y的值,但会导致范围运算符增加。
- @我认为标准中没有支持你的索赔。该标准只规定x--表示减少x的值,而表达式的值是x的原值。
- @AugustKarlstrom你是错误的,因为在x == 0的情况下,while (x > 0) {x--;}给了你x == 0,而while (x-->0){}给了你x == -1。
- @泰格,你说得对,这说明了有副作用的表达式是多么容易出错。
- 有一阵子我以为是关于"—>"。这个接线员叫什么名字?
- @androiddeveloper问题中的一个没有标准名称,您注释中的一个称为取消引用(或间接)操作符。
- 我会说,这个的"名称"就是"贪婪的解析器"。C++总是从流中抓取字符,只要它能得到它所理解的东西。这就是为什么结果是——和>,而不是——和->。
- 同样适用于PHP,您不能用double加速——不幸的是,它给出了一个解析错误。
- 它实际上是一个有用的特性:创建倒计时循环的简单方法(比for更短)
或者完全不同的东西…X幻灯片到0
1 2 3 4 5 6
| while (x --\\
\\
\\
\\
> 0)
printf("%d", x); |
不是很数学,但是…每一幅画都画上千言万语…
- 对不起,我不明白。这是怎么工作的?
- @mafutrt-我记得它在c中只是附加下一行,好像没有换行符。这里的基本上什么都不做。
- @mafu字符'\'告诉编译器当前行在下一行继续,因此编译器应该合并这两行并编译为一行。而(x-->0)'将一直运行到x等于-1。但是,他做缩进的方式让它看起来像是x滑到了零。当X滑到0…'
- 在减量运算符中,IIRC、K&R C允许在‘-’之间有空格,在这种情况下,您可以将反斜杠放在中间,这样看起来更酷。:)
- 反斜杠是一个转义字符,您使用\转义换行符,这样编译器只看到基本上已删除的空白,因此这相当于(x->0)
- @arnavborah en.wiktionary.org/wiki/a_picture_paints_a_千字
- @不同步,但"单词"在哪里
- @这是一个古老的表达,意思是why waste words when a picture does a better job,在这里用作笑话。(实际上有2个关键字while和printf)
- 啊,是的,那个不起眼的滑盖操作员。我怎么能忘记呢!
- @不同步:printf不是c中的关键字。
- @Hogan反斜杠""不告诉编译器在当前行中追加下一行。它只是从结束\
的线路上逃走。
- @totten——我想你有一个观点——事实上不会发生"附加"——它将被lexer和parser忽略。当然,从抽象和最终用户的角度来看,它与附加是相同的。但你说得很好,不是"同一件事"。
- +1代表(monty)python参考,…现在代表完全不同的东西…有滑鼻的平滑操作员(滑鼻可能是粗糙的操作员?)
这是一个非常复杂的操作符,所以即使ISO/IEC JTC1(联合技术委员会1)将其描述放在C++标准的两个不同部分。
除此之外,它们是两种不同的算子:EDOCX1×1和EDOCX1,2分别描述在++2.6/2和5.9的C++03标准中。
相当于
x--(后减量)相当于x = x-1,因此,代码转换为:
1 2 3 4
| while(x > 0) {
x = x-1;
// logic
} |
- 这不太对。在第二种情况下,循环体中的x值不同。示例中的赋值语句应该在逻辑之上,以便等效。postfix——减去1,但是会与减去之前的值进行比较。
- @乌利维斯塔,这些确实是等价的。如果使用前缀是错误的:在这种情况下,x在逻辑之前递减。在后缀中,逻辑在减量之前执行,因此两个样本都是等效的。可以把它们写在一个Console中,然后测试它们。
- 它们仍然是不等价的。在第一个循环之后,x是-1(如果它是无符号的,则为溢出),在第二个循环之后,它是0。(假设x以非负开头,则循环既不会修改x,也不会中断或…)
x在相反的方向上可以更快地归零:
1 2 3 4 5 6
| int x = 10;
while( 0 <---- x )
{
printf("%d", x);
} |
8 6 4 2
你可以用箭头控制速度!
1 2 3 4 5 6
| int x = 100;
while( 0 <-------------------- x )
{
printf("%d", x);
} |
90 80 70 60 50 40 30 20 10
;)
- 我使用的是哪种操作系统,这种类型的输出,因为我有一条错误消息
- @布瓦内什操作系统是无关的。这是一个简单的C++代码(使用EDOCX1,0,因为OP使用它),它应该到处编译,所以它必须是你的错误。coliru.stacked-croked.com/a/f5fdc710da0398c9
- 尽管对于C++新手来说,阅读它是显而易见的,但不要这么做。如果需要增加/减少一个以上,只需使用增强赋值。
- 用"激光"调零。而(0>————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————相同的输出。
- 很好的尝试,但是--x不返回左值,所以--(--x)不编译。
- @您确定它没有编译吗?-->coliru.stacked-croked.com/a/5aa89a65e3a86c98
- 它在C++中编译,但不在C中编译。
- 我刚检查过,opposite goes to和激光BIU~~都不是很快,因为它们不能被gcc优化!
- 是的,这不是用C编译的。
它是
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d", x);
}
return 0;
} |
只是空间让事情看起来很有趣,--减量和>比较。
-->的使用具有历史意义。递减过去(在某些情况下仍然如此),比x86体系结构上的递增快。使用-->表明x将指向0,并吸引具有数学背景的人。
- 不完全正确。递减和递增所用的时间相同,其好处是与零相比,与变量相比,零的比较速度非常快。这对于许多体系结构都是正确的,不仅仅是x86。任何带有JZ指令的内容(如果为零则跳转)。在搜索周围,您可以找到许多"for"循环,这些循环是向后写的,以便在比较时保存循环。这在x86上特别快,因为减少变量的操作会适当地设置零标志,因此您可以在不必显式比较变量的情况下进行分支。
- 好吧,向零递减意味着每次循环迭代只需要与0进行比较,而向n迭代意味着每次迭代与n进行比较。前者往往更容易(在某些体系结构中,在每次数据注册操作后都会自动测试)。
- @卷饼虽然我不反对,但以非零值为条件的循环通常能被完美地预测出来。
- @从O(N)操作到O(1)操作的Konerak几乎总是可取的。
- C递增/递减运算符允许访问PDP11指令。在这个架构中,*p++比*++p快,而*--p比*p--快。我不记得P++,P--&;++P,--P在循环时间上是否不同,但是对于那些仔细编码的人来说,微优化是可行的。原因是,Arch被调到支持非常常见的堆栈操作push&pop。
- 增量和减量同样快,可能在所有平台上(绝对是在x86上)。区别在于测试循环结束条件。要查看计数器是否已达到零实际上是免费的-当您减少一个值时,处理器中会设置一个零标志,为了检测结束条件,您只需检查该标志,而当您增加一个比较操作时,在检测到结束条件之前需要进行比较操作。
- 当然,现在所有这些都是没有意义的,因为现代编译器可以自动向量化和反转循环。
- 作为另一个答案或评论中的脚注,这会更好——它显然不能解释-->的含义,也就是所要求的含义。
- IIRC PDP11*P++是第四个实现的基础,也是实现速度的一部分(编译代码比常规汇编程序"更快",不需要访问或使用调用指令;-)
- 在x86 ASM中,LOOP 减少ECX寄存器,然后跳到,除非ECX的减量导致零。将循环计数器减小到零允许编译器生成单个LOOP指令,而增加或计数到其他值则需要单独的inc/dec/add/sub、compare和条件性跳转指令。如果循环中不使用counter的值,现代编译器通常可以将其他循环转换为counter --> 0循环。
- 继续我之前的评论:MOV ECX, value,@start:,,LOOP @start是一个x86 ASM等价于counter = value - 1; while (counter --> 0) { ; }。请注意,如果value最初为零,它将变为barf,因此需要进行额外的预循环检查。
就是这样分析的。
真是极客,但我会用这个:
1 2 3 4 5 6 7 8 9
| #define as ;while
int main(int argc, char* argv[])
{
int n = atoi(argv[1]);
do printf("n is %d\
", n) as ( n --> 0);
return 0;
} |
- 我希望我永远不会碰到你的源代码…
- @mk12那不是源代码……是象形文字:—)
- @safx-这将是埃及方括号的完美象形文字
- 这无法编译。c不是pascal,其中do ... while的内部是一个语句列表。在C语言中,它是一个块,所以它必须是do { ... } while。
- @它确实编译。语法是do statement while ( expression ) ;。说了这句话,我希望大家能理解我是在开玩笑。
我读过的一本书(我记不清是哪本书)说:编译器试图使用左-右规则将表达式解析为最大的标记。
在这种情况下,表达式:
解析为最大的标记:
1 2 3 4 5
| token 1: x
token 2: --
token 3: >
token 4: 0
conclude: x-- > 0 |
同样的规则也适用于此表达式:
解析后:
1 2 3 4 5 6
| token 1: a
token 2: --
token 3: --
token 4: -
token 5: b
conclude: (a--)-- - b |
我希望这有助于理解复杂的表达^^
- 你的第二个解释不正确。编译器将看到a-----b并认为(a--)-- - b没有编译,因为a--没有返回左值。
- 另外,x和--是两个独立的代币。
- 这就是所谓的最大咀嚼。
- @博士:它通过了莱克斯。只有语义传递才能发出错误。所以他的解释是正确的。
- 只要你认为-->是一个运算符(这就是所问的问题所隐含的含义),这个答案根本没有帮助——你会认为令牌2是-->,而不仅仅是--。如果你知道-->不是一个运算符,那么你理解问题中的代码可能没有问题,因此,除非你有一个完全不同的问题,否则我不确定这是如何有用的。
- @假设a重载了后递减运算符(返回lvalue),则doctort示例是正确的。coliru.stacked-croked.com/a/e1effc351ae79e9f
- 它解释了为什么它不被解析为a - -> b,因为->本身就是一个操作符。
- 实际上(x-)->是一个语法错误。
- 尝试了--B,编译器称EDCOX1为3,即使使用C++ 11。
这和
1 2 3 4
| while (x--)
{
printf("%d", x);
} |
非负数
- 难道这不是for(--x++;--x;++x--)吗?
- @教条这就是unsigned的目的
- @Mateenulhaq,根据标准,这是错误的。根据&167;1.9.15,表达式--x++具有未定义的行为。
- 如果它使用unsigned,它会使用%u。
不管怎样,我们现在有一个"去"的接线员。"-->"很容易被记忆为一个方向,"当x归零时"是直接的意思。
此外,在某些平台上,它比"for (x = 10; x > 0; x --)"稍微高效一点。
- 总是不可能是真的,特别是当x的值为负时。
- 另一个版本并没有做同样的事情-对于for (size_t x=10; x-->0; ),循环体使用9,8,..0执行,而另一个版本使用10,9,..1执行。用一个无符号变量退出一个向下为零的循环是非常困难的,否则。
- 我觉得这有点误导…因为我们需要另一个++>来完成增量工作,所以我们没有真正的"转到"运算符。
- @乔希:事实上,溢出给int带来了不明确的行为,所以它可以很容易地吃掉你的狗,就像把x变为零,如果开始是负的。
- 由于@petekirkham在comnmet中给出的原因,这是一个非常重要的习语,因为我经常需要减少对无符号数量的循环,一直到0。(相比之下,省略零测试的习惯用法,例如写while (n--)而不是不带符号的n,不会给你带来任何好处,对我来说,这极大地阻碍了可读性。)它还有一个令人愉快的特性,即你指定的索引比初始索引多一个,这通常是你想要的(例如,对于数组上的循环,你指定它的大小)。我也喜欢没有空间的-->,因为这使得习语很容易识别。
- …实际上,我有点后悔,写while(0<--n)和写while(n-->0)不一样,前者通常不是你想要的。另一方面,至少在C++中,可以使EDCOX1与14的速度下降两倍。
- x=10; while(x --> 0)与for(x=10; x>0; x--)不同。另一方面,它与for(x=10-1; x=>0; x--)相同。
- 好吧,还有while(0 <=-- x)。但这越来越愚蠢了(呃):p
此代码首先比较x和0,然后比较x。(在第一个回答中也说过:您是后减x,然后将x和0与>运算符进行比较。)请参见此代码的输出:
现在,我们首先比较,然后通过在输出中看到0进行递减。
如果要先递减然后比较,请使用以下代码:
1 2 3 4 5 6 7 8 9 10 11
| #include <stdio.h>
int main(void)
{
int x = 10;
while( --x> 0 ) // x goes to 0
{
printf("%d", x);
}
return 0;
} |
输出是:
运行此代码时,编译器将打印出9876543210。
1 2 3 4 5 6 7 8 9 10
| #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。
1 2 3 4 5
| while( x > 0 )
{
x--;
std::cout << x;
} |
是一种不同的写作方式。
不过,很高兴原版看起来像"X变为0"。
- 只有在同一语句中多次递增/递减同一变量时,结果才是未定义的。这不适用于这种情况。
- while( x-- > 0 ) actually means while( x > 0)—我不知道你想说什么,但是你的措辞暗示了--毫无意义,这显然是错误的。
--和>之间缺少一个空格。x是后减量,即检查x>0 ?条件后减量。
- 空格不丢失-c(++)忽略空白。
- @H2CO3一般来说不是这样。有些地方必须使用空白来分隔令牌,例如在#define foo()和#define foo ()中。
- @Jens怎么办:"空格没有丢失-c(++)忽略了不必要的空格。"?
--是减量运算符,>是大于运算符。
这两个运算符作为单个运算符应用,如-->。
- 它们被应用为两个独立的运算符。它们只是写得错误,看起来像"一个"。
它是两个运算符的组合。第一个--用于减小值,而>用于检查值是否大于右操作数。
1 2 3 4 5 6 7 8 9 10 11
| #include<stdio.h>
int main()
{
int x = 10;
while (x-- > 0)
printf("%d",x);
return 0;
} |
输出将是:
实际上,x是后递减的,并且正在检查这种情况。不是-->,是(x--) > 0。
注:检查条件后,x的值发生变化,因为它是后递减的。也可能出现一些类似的情况,例如:
1 2 3 4
| --> x-->0
++> x++>0
-->= x-->=0
++>= x++>=0 |
- 但是,++>很难在一段时间内使用()。一个"上升到…"的操作符应该是++<,这看起来并不是很好。接线员——>是一个愉快的巧合。
- 那么,while (0 <-- x)也能工作吗?
- @Benlegiero可以在生成代码的意义上"工作",但语义是不同的,因为它使用预处理意味着它将执行更少的迭代。作为一个人为的例子,如果x从1开始,它将永远不会执行循环体,但是while ( (x--) > 0 )会。编辑Eric Lippert在他的C 4发行说明中涵盖了这两个方面:blogs.msdn.microsoft.com/eric lippert/2010/04/01/&hellip;
C和C++遵循"最大MunCH"规则。同样地,a---b被翻译成(a--) - b,在你的例子中,x-->0被翻译成(x--)>0。
规则的实质是从左到右,表达式是由最多个字符组成的,这些字符将构成一个有效的表达式。
- 这就是OP假设的:"(a)->"是最大的咀嚼。结果发现,操作的原始假设不正确:"-->"不是最大有效运算符。
- 也被称为贪婪解析,如果我能正确回忆的话。
- @罗廷克贪婪的扫描。解析器与此无关。
为什么这么复杂?
原始问题的简单答案是:
1 2 3 4 5 6 7 8 9 10
| #include <stdio.h>
int main()
{
int x = 10;
while (x > 0)
{
printf("%d", x);
x = x-1;
}
} |
做同样的事。不是说你应该这样做,但它做了同样的事情,并且会在一个帖子里回答这个问题。
x--只是上面的简写,>只是比operator大的一个正常值。没什么大不了的!
现在有太多人把简单的事情变得复杂了;)
- 这个问题不是关于复杂的,而是关于C++的隐藏特性和暗角的。
- 这里的程序给出的输出与原来的不同,因为这里的x在printf之后是递减的。这很好地证明了"简单答案"通常是错误的。
- 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。
- 它做不到同样的事情。在printf之前移动你的x=x-1,然后你可以说"它做了同样的事情"。
传统的方法是在while循环中定义条件圆括号"EDOCX1"(6),在括号"EDOCX1"(7)中定义终止条件,但是这个--&>是一种同时定义所有条件的方法。例如:
1 2 3 4 5 6
| int abc(){
int a = 5
while((a--) > 0){ // Decrement and comparison both at once
// Code
}
} |
它说,减少a并运行循环,直到a大于0时为止。
另一种方式应该是:
1 2 3 4 5 6 7
| int abc(){
int a = 5
while(a > 0){
// Code
a = a -1 // Decrement inside loop
}
} |
两种方式,我们都做同样的事情,实现同样的目标。
- 这是不正确的。问题中的代码是:"test write execute"(首先测试,写入新值,执行循环),您的示例是"test execute write"。