for循环为啥在括号外面打印的值加1呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了for循环为啥在括号外面打印的值加1呢相关的知识,希望对你有一定的参考价值。

#include <stdio.h>
main()

int i,j;
for(i=0;i<2;i++)

printf("%d\n",i);

printf("%d\n",i);

为什么括号外面打印的i=2而不是1呢?望高手赐教!

参考技术A for(i=0;i<2;i++)

printf("%d\n",i);

这条for循环语句推出的条件是i<2,所以,i初始化时的值是1,每执行一次for循环后,i都要进行加加(++)一次,而当i++的值等于2时,将退出for循环。所以,最后的printf("%d\n",i);语句打印i值时为2。

希望你能够理解我的解释
参考技术B for循环是这样的
例如for(i=0;i<2;i++)
进入for循环先赋值,i=0,紧接着然后判断i是不是符合循环条件,如果符合就进入循环程序

然后执行循环的程序
然后执行i++
然后再次判断i是不是符合循环条件

所以可以这么理解,for循环之后的条件变量,肯定是第一个不满足循环条件的值,比如你是i<2,第一个不满足条件的就是2,如果是i<=2,第一个不满足条件的就是3本回答被提问者采纳
参考技术C 你的程序可以简化:

#include <stdio.h>
main()

int i;
for(i=0;i<2;i++)

printf("%d\n",i);

printf("%d\n",i);


下面是具体的分析:

#include <stdio.h>

main()

int i,j; //你定义的j有什么用???????

for(i=0;i<2;i++)

//首先,限定了i的两个值0和1,其次,表明要循环两次

//然后i++是针对这两个值的变化

//然后是



//这个花括号多余

printf("%d\n",i);

//执行两次,第一次:是i=0,输出0,

//第二次:i=1(因为i++),输出1.

//注意啊:输出1之后,循环要返回,即i++,i=2;

//返回校验是不是符合中断条件(i<2),这是i已经变成2了,中断。



//这个花括号多余,因为for语句只管一行,下面一行,管不住

printf("%d\n",i);

//这里输出2
参考技术D for(i=0;i<2;i++)
看这个for循环就知道后面不可能是1了,如果是1的话,i<2成立,继续执行循环...
第5个回答  2008-03-05 for(i=0;i<2;i++)

printf("%d\n",i);

i=0时 i=1
i=1 时 i=2
所以i=2

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

【中文标题】在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?【英文标题】:In Windows Batch, why a for loop surrounded by parenthesis won't expand a variable it's told to echo?在 Windows Batch 中,为什么用括号括起来的 for 循环不会扩展它被告知要回显的变量? 【发布时间】:2021-08-22 03:54:11 【问题描述】:

在我的项目中,我需要使用findstr 解析命令的多行输出。为此,我按照this answer 创建了一个行数组,并使用for 循环将它们逐个echo

(for /L %n in (1 1 %info_count%) do echo %info[%n]%)| findstr /R /C:"[0-9s]: [0-9]" /C:"bytes"

问题是这会导致echo 部分输出%info[1]%%info[2]% 等等。

但是,删除第一组括号会导致 for 循环的 do 部分同时解释 echo 和管道部分,这意味着通过一个管道而不是六个 echo 输出,我通过六个不同的管道获得六个(扩展的)echo 输出。

是什么导致了这个问题?

PS:上面的 sn-p 正是我在整个脚本运行后在结果提示中调查的内容。在主项目中,我自然会为我的变量和批处理文件循环内的适当变量使用延迟扩展(即setlocal enabledelayedexpansion!var!%%a


编辑:鉴于jeb's answer,我添加了更长的sn-p,并且我理解问题在于findstr是一个外部exe。

for /f %%d in ('^(for /L %%n in ^(1 1 !info_count!^) do echo !info[%%n]!^)^| ^(findstr /R /C:"[0-9s]: [0-9]" /C:"bytes"^)^| find /c /v ""') do (
    if [%%d]==[0] (
        ...
    ) else (
        ...

其目的是分析 mkvmerge -i 的输出,这是一个已放入数组(!info1!!info2 等)的多行文本,使用 findstr 检测两个所需匹配项之一,然后使用find 输出匹配的数量,这将决定下一行的行为。

我试图通过这一切实现的是避免多次启动 mkvmerge,但我已经有了一个可行的替代方案,它只是再次调用 mkvmerge 而不是 for /l 循环(这意味着双管道正在工作另一种情况)。

This answer,感谢jeb,建议在findstr 周围添加括号可以解决问题。对我来说不是这样。

【问题讨论】:

你必须在由 FOR 控制的变量中使用 double %:FOR /L %%n (....) 否则 %n 会被自己替换,...​​...什么都没有。 @user207421 命令是在命令行执行的,所以符号百分号是正确的 【参考方案1】:

在命令行上测试这个没有用,因为行为与批处理文件不同。

这里的主要问题是百分比扩展。它在解析块时被扩展!

下一个问题是百分比表达式的嵌套不能以这种方式完成。 %info[%n]% 分为%info[%n]%

在批处理文件中,您将使用延迟扩展来避免所有这些问题。

(for /L %%n in (1 1 !info_count!) do echo !info[%%n]!) | findstr /R /C:"[0-9s]: [0-9]" /C:"bytes"

但它仍然失败,因为您正在将一个延迟扩展的块输送到findstr。 管道使用默认配置启动两个子 cmd.exe 进程,然后再次禁用延迟扩展。 Why does delayed expansion fail when inside a piped block of code?

您可以将 findstr 移动到块中,然后将 !info[%%n]! 展开,然后将其传输到新的 cmd.exe 实例。

for /L %%n in (1 1 !info_count!) do (
  echo !info[%%n]! | findstr /R /C:"[0-9s]: [0-9]" /C:"bytes"
)

这会比较慢,因为它会启动 findstr 和每个循环的管道。

在您提供更多信息后:

包围 findstr 在这里没有帮助,因为那不是你的问题。 如果您直接启动 findstr 或在 cmd.exe 实例中启动并不会改变行为,那么只有在管道 findstr 部分中存在百分比扩展时才需要该技巧。

如果您只想计算匹配项,则可以不使用find

set /a match_cnt=0
for /L %%n in (1 1 %info_count%) do (
  echo !info[%%n]! | findstr /R /C:"[0-9s]: [0-9]" /C:"bytes" > nul
  if !errorlevel! == 0 set /a match_cnt+=1
)

echo matches: !match_cnt!

您还可以修改您的初始代码以使用:

( 
    for /L %%n in (1 1 %info_count%) do @(
        cmd /V:on /C echo !info[%%n]!
    )
) | findstr /R /C:"[0-9s]: [0-9]" /C:"bytes"

或者没有cmd /v:on的(缓慢)调用也一样

    call echo %%^^info[%%n]%%

【讨论】:

首先我不认为%info[%n]% is being split, as my testing shows %n%` 扩展了。其次,将findstr 移动到块中会遇到另一个问题,我将不得不编辑我的问题并使用更大的 sn-p 来说明原因。第三,您提出的调查路线使我相信findstr 是一个外部exe 是问题所在。然而,提供的解决方案,将其括起来,并没有帮助。所有这些都非常有帮助,我明天会继续调查,谢谢! @FabioFreitas 您可以在之前使用set info[=WRONG split 测试拆分行为

以上是关于for循环为啥在括号外面打印的值加1呢的主要内容,如果未能解决你的问题,请参考以下文章

Python中for语句循环执行次数怎么求?

在 bash for 循环中使用命令行参数范围打印包含参数的括号

为啥打印和回声在“for”循环中表现不同[重复]

为啥 for-in 循环不打印我想要的内容? [复制]

循环排序:为啥最外面的循环运行(n-1)次

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?