C++ C++;for循环与while循环的行为

C++ C++;for循环与while循环的行为,c++,loops,for-loop,compiler-construction,C++,Loops,For Loop,Compiler Construction,据我所知,当你写一个类似于这个的for循环时 for (int i = 0; i < SOME_NUM; i++) { if (true) do_something(); else do_something_else(); } 内部for循环中的j现在是i的上限,该值在每次循环重新启动时都会更改。编译器将如何编译这个?这些嵌套的for循环本质上是否像for循环一样,内部有while循环?如果您正在编写一个使用嵌套for循环的算法,其中内部计数变量依赖于外部计数变

据我所知,当你写一个类似于这个的for循环时

for (int i = 0; i < SOME_NUM; i++) { 
  if (true)
    do_something();
  else
    do_something_else();
}
内部for循环中的
j
现在是
i
的上限,该值在每次循环重新启动时都会更改。编译器将如何编译这个?这些嵌套的for循环本质上是否像for循环一样,内部有while循环?如果您正在编写一个使用嵌套for循环的算法,其中内部计数变量依赖于外部计数变量,您是否应该关心这会对算法的复杂性造成什么影响?

“如果我错了,请纠正我。”

你错了

您可以在“第一个”循环的某个地方添加
i++
,这将“破坏”您的代码。当然会将
i
SOME NUM
进行比较。

“如果我错了,请纠正我。”

你错了

您可以在“第一个”循环的某个地方添加
i++
,这将“破坏”您的代码。当然,将执行
i
SOME_NUM
的比较

此操作的时间复杂度主要受if(true)语句的影响,因为for循环迭代实际上不涉及i与某个_NUM的任何比较,编译器只会在for循环中运行代码几次。如果我错了,请纠正我

是的,你错了。在每次迭代开始时,递增
i
,并检查条件表达式
i

如果您正在编写一个使用嵌套for循环的算法,其中内部计数变量依赖于外部计数变量,那么您是否应该关心这会对算法的复杂性造成什么影响

对。在这种情况下,你必须考虑嵌套的影响。因此,最好是移除嵌套

此操作的时间复杂度主要受if(true)语句的影响,因为for循环迭代实际上不涉及i与某个_NUM的任何比较,编译器只会在for循环中运行代码几次。如果我错了,请纠正我

是的,你错了。在每次迭代开始时,递增
i
,并检查条件表达式
i

如果您正在编写一个使用嵌套for循环的算法,其中内部计数变量依赖于外部计数变量,那么您是否应该关心这会对算法的复杂性造成什么影响

对。在这种情况下,你必须考虑嵌套的影响。因此,最好是移除嵌套。

我想你应该学习。循环构造有一个条件语句,它指示是否将进入循环以及将迭代多少次。
if(true)
简单地指示是否执行以下语句(在这种情况下是因为条件始终为true)

总之,第一个循环将执行
SUM\u NUM
次(
O(SUM\u NUM)
),第二个循环是
O(n^2)
循环。

我想你应该学习一下。循环构造有一个条件语句,它指示是否将进入循环以及将迭代多少次。
if(true)
简单地指示是否执行以下语句(在这种情况下是因为条件始终为true)


总之,第一个循环将执行
SUM\u NUM
次(
O(SUM\u NUM)
),第二个循环是
O(n^2)
循环。

编译器是否可能检测到
某个NUM
是常量,并且
i
for
循环的主体中没有被修改,因此,重复body
SOME_NUM
几次?@RSahu当然有可能,编译器可以内联函数并在认为合适的时候展开循环。编译器是否可以检测到
SOME_NUM
是一个常量,并且
i
for
循环的body中没有被修改,因此,重复body
几次?@RSahu当然有可能,编译器可以内联函数,并在认为合适的时候展开循环。我在这里不会称之为“时间复杂性”,因为它通常指的是运行时的大开销。而且,是的,至少在C++意义上,在更广泛的意义上是在for循环中进行比较,是的,优化器可以优化它,但是它与VS while循环无关。在一天结束的时候,它变成了组装,如果需要在那里进行比较,那么它就会进行。尽管它可能会展开它。一段时间和一个for循环在实用性上都是一样的。编译器会尽其所能优化任何东西,它可以同时优化这两个方面,而且它非常擅长。在这个简单的例子中,我猜编译器将能够检测到内部循环是无意义的,并且总的来说做一些事情会被称为常量时间。另外,在这里花费时间的另一件大事是函数调用,不过编译器也可以将其内联。另一件需要花费时间的事情是分支预测;也就是说,如果在运行时处理器预测将使用if块,而不是,那么您将刷新管道。但是,在这种情况下,if语句将在优化代码中完全编译出来,因为它总是正确的。如果有疑问,请查看源代码生成的程序集。调试它。您将更好地了解编译器可以做和将要做的事情的种类,这也将取决于程序集中可用的指令的种类,具体取决于您的平台。不过,如果您想看到优化,请确保您在编译时启用了它们。这非常有用,谢谢。我在这里不会称之为“时间复杂性”,因为它通常指的是运行时。是的,在for循环中进行比较,至少在C++意义上,i
for (int i = 0; i < SOME_NUM; i++) {
  for (int j = 0; j < i; j++) {
   do_something();
  } 
}