Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以前从未见过C++;for循环 我将C++算法转换成C语言。 我遇到了这样一个循环: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; 它在C++中没有错误,但是它在c*中(不能转换int到BoL)。 我真的搞不懂这个循环,条件在哪里_C#_C++_For Loop - Fatal编程技术网

C# 以前从未见过C++;for循环 我将C++算法转换成C语言。 我遇到了这样一个循环: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; 它在C++中没有错误,但是它在c*中(不能转换int到BoL)。 我真的搞不懂这个循环,条件在哪里

C# 以前从未见过C++;for循环 我将C++算法转换成C语言。 我遇到了这样一个循环: for (u = b.size(), v = b.back(); u--; v = p[v]) b[u] = v; 它在C++中没有错误,但是它在c*中(不能转换int到BoL)。 我真的搞不懂这个循环,条件在哪里,c#,c++,for-loop,C#,C++,For Loop,有人能解释一下吗 顺便说一句,检查一下,让一个向量适应一个列表就行了 b、 back() 对应 b[b.Count-1] ?在C语言中,在“布尔”上下文中,如循环结束条件或条件语句中,所有非零的内容都是true。在C语言中,你必须明确检查:u--!=0条件是u--,因为它位于指令的第二个位置 u = b.size(), v = b.back() 如果u--不同于0,它将被解释为true(即隐式转换为布尔值true)。相反,如果其值为0,则它将被强制转换为false 这是 更新:我在本文中讨论了

有人能解释一下吗

顺便说一句,检查一下,让一个向量适应一个列表就行了 b、 back() 对应 b[b.Count-1]

在C语言中,在“布尔”上下文中,如循环结束条件或条件语句中,所有非零的内容都是
true
。在C语言中,你必须明确检查:
u--!=0

条件是
u--,因为它位于指令的第二个位置

u = b.size(), v = b.back()
如果
u--
不同于0,它将被解释为
true
(即隐式转换为布尔值
true
)。相反,如果其值为0,则它将被强制转换为
false

这是

更新:我在本文中讨论了“for”循环的编写。其建议可归纳如下:

for循环是一种实用的、可读的(一旦您习惯了)和 简洁的构造,但您需要很好地使用它。因为它不寻常 语法,以一种过于富有想象力的方式使用它不是一个好主意

for循环的所有部分都应该简短易读。变量名 应选择使其易于理解


这个例子显然违反了这些重写。

< P> < <代码> < < /Cult>循环的条件位于两个分号<代码>之间;<代码>

在C++中,把几乎任何表达式作为条件都可以:任何计算为零的值都意味着<代码> false <代码>;非零表示
true

在您的情况下,条件是
u--
:当您转换为C时,只需添加
!=0

for (u = b.size(), v = b.back(); u-- != 0; v = p[v]) 
    b[u] = v; //                     ^^^^ HERE

该条件是
u--
的结果,它是
u
递减之前的值

< C和C++中,<代码> int >隐式地执行<代码> >可转换为BoL!0
比较(0为
,其他所有内容均为

b.back()
是容器中的最后一个元素,当
size()!=0

u = b.size(), v = b.back()
是初始化

u--
这就是条件

v = p[v]
是迭代

这将是循环的C形式

// back fetches the last element of vector in c++.
for (u = b.size(), v = b.back(); (u--) != 0; v = p[v]) 
{      
  b[u] = v;      
}
只需替换size()和back()的等效项即可

它所做的是反转列表并存储在数组中。 但在C#中,我们直接使用系统定义的函数。所以你也不需要写这个循环

b = b.Reverse().ToArray();

有很多准确的答案,但我认为值得写出等价的while循环

for (u = b.size(), v = b.back(); u--; v = p[v]) 
   b[u] = v;
相当于:

u = b.size();
v = b.back();
while(u--) {
   b[u] = v;
   v = p[v];
}
你可以考虑重构到Wh()格式,因为你翻译成C。在我看来,这更清楚,对新程序员来说,陷阱更少,效率也同样高

正如其他人所指出的——但要使我的答案完整——要使它在C语言中工作,您需要将
while(u--)
更改为
while(u--!=0)

。。。或者
while(u-->0)
以防u开始为负值。(OK,<代码> B siz()/<代码>永远不会是否定的-但是考虑一个一般情况,也许其他东西初始化U)。< /P> 或者,更清楚地说:

u = b.size();
v = b.back();
while(u>0) {
   u--;
   b[u] = v;
   v = p[v];
}

最好是明了而不是简洁。

< P>如其他人所说,C++对布尔有隐式转换意味着条件是“代码> U-<代码>,如果值为非零,则为真。 值得补充的是,你在问“条件在哪里”时有一个错误的假设。在C++和C语言(以及其他类似的同步语言)中,可以有空条件。在这种情况下,它的计算结果总是true,因此循环将永远继续,或者直到其他条件退出(通过
返回
中断
,或
抛出

事实上,for语句的任何部分都可以省略,在这种情况下,它就不会被执行

一般来说,
表示(A;B;C){D}
表示(A;B;C)D变为:

{A}
loopBack:
if(!(B))
  goto escapeLoop;
{D}
{C}
goto loopBack;
escapeLoop:
可以省略A、B、C或D中的任何一个或多个

因此,一些人赞成(;)
无限循环。我之所以这么做是因为虽然
while(true)
更受欢迎,但我把它读作“直到真相最终成为真的”,这听起来比我把(;;)
读作“永远”有点像世界末日

这是一个品味的问题,但因为我不是世界上唯一一个喜欢(;)
的人,所以有必要知道它的意思。

在C#中遇到的错误本身就消除了疑问。for循环搜索一个

假的

终止的条件。正如我们所知

(BOOL)FALSE=(int)0

<>但是C不能像C++那样处理它自己。因此,您正在搜索的条件是

u--

但你必须用C#as明确给出条件

你——!=0

u-->0

但还是尽量避免这种编码实践。

while循环

以上所述的答案是你的答案中最简化的版本之一

循环


所有答案都是正确的:-

for loop可通过以下多种方式使用:

Single Statement inside For Loop
Multiple Statements inside For Loop
No Statement inside For Loop
Semicolon at the end of For Loop
Multiple Initialization Statement inside For
Missing Initialization in For Loop
Missing Increment/Decrement Statement
Infinite For Loop
Condition with no Conditional Operator.

如果你习惯了C/C++,这个代码并不难读,虽然代码很简洁,但代码却不那么好。因此,让我解释一下最重要的部分。首先,C for循环的一般语法如下所示:

for (<initialization> ; <condition>; <increment>)
{
    <code...>
}
for (u = b.size() - 1, v = b.back(); u>=0; --u) 
{
    b[u] = v;
    v = p[v]
}
原因是,至少对我来说,这更清楚。for循环的每个部分都完成了自己的工作,其他什么都没有。在原始代码中,条件是修改变量。增量部分正在做一些应该在代码块中的事情

逗号运算符可能也会使您陷入循环。在C语言中,像
x=1,y=2这样的东西在编译器看来就像一条语句
std::cout << "(1,2)=" << (1,2) << std::endl;
for (u = b.size(), v = b.back(); u--; v = p[v]) 
   b[u] = v;