【问题标题】:What will be the output of this code and can you explain the step by step progression?这段代码的输出是什么,你能解释一步一步的进展吗?
【发布时间】:2020-04-14 10:55:54
【问题描述】:

我尝试了这段代码并得到了下面的输出。但我不明白它是怎么来的。 这段代码的 sn-p 所涉及的逻辑是什么?你能解释一下吗?
此外,当 ++i 被 i++ 替换时,它会给出不同的输出??

int main() 
{  
  char i= 0;
  for(i<=5 && i>=-1;++i;i>0) 
    printf("%d\n",i); 
  printf("\n"); 

return 0; 
}

输出:

1 2 3 .... 126 127 -128 -127 .... 2 1.

【问题讨论】:

  • 条件与字符比较。Check this image
  • for 循环的循环终止条件是++i 即直到i 不为零,它将迭代& printf 被执行,当i 在条件部分变为零时,它来自循环。

标签: c loops for-loop char


【解决方案1】:

这就是 C 标准对 for 循环的描述:

声明

(clause-1 ; expression-2 ; expression-3 ) 语句

的行为如下:表达式 expression-2 是控制 在每次执行循环体之前计算的表达式。 表达式 expression-3 在之后被评估为 void 表达式 循环体的每次执行。如果第 1 条是声明,则 它声明的任何标识符的范围是 声明和整个循环,包括其他两个表达式; 它在第一次评估之前按执行顺序到达 控制表达式。如果 Clause-1 是一个表达式,它是 在第一次评估之前评估为 void 表达式 控制表达。

for 循环开始打印,i 等于 1i 在达到char 数据类型可能的最大值后回绕。当表达式 2 即 ++i 在这种情况下为 0 时,循环终止。当i-1 时,++i 的计算结果为0

另请注意,溢出有符号数会导致未定义的行为。 char 数据类型可能是有符号或无符号的,具体取决于您的系统。

【讨论】:

  • 你说循环在 i 等于 -1 时终止。但是为什么当 i 大于等于 6 时它不终止呢?
  • 因为“表达式-2”,在这种情况下是++i,是在每次执行循环体之前评估的控制表达式。必须将此表达式计算为 0 才能终止循环。
  • 我知道 ++i 必须被评估为 0 才能终止循环,但我要问的是为什么当 i 的值变为 6 时它不被评估为 0 ,这与第一个条件 i=-1 相矛盾。
  • 第一个子句负责验证循环是否会执行,第一个子句只执行一次。请重新阅读我的回答中引用的文字。
  • 好的,我得到了这个。但是当 i 为 -1 时,++i 怎么会计算为 0?
【解决方案2】:

是因为你写的for循环

for(i<=5 && i>=-1;++i;i>0) 

for 循环中的第一个选项执行一次。它不检查条件是否为真,也不控制循环执行。即使表达式计算为 0,循环也会开始执行。 第二部分在每次循环开始时执行,它是循环中断条件。也就是说,如果这个表达式的结果为 0,它就会中断。

第三部分每次都执行一次,不影响循环执行。

现在让我们分析您的代码。 i 在进入循环之前被初始化为 0。 for 循环中的初始化程序会进行条件检查,i&lt;=5 &amp;&amp; i&gt;=-1 但不会更改 i 的值。 条件部分对变量 i 进行增量,每次进入循环时都会发生这种情况。所以值从 0,1,2,..127,-128,-127...-1 (因为它是 signed char 范围从 -128 到 127)然后达到 0 ,这意味着错误。当它评估为 0 时,for 循环中断。因此你得到的输出。 第三部分又是一个条件,它不会更新值。

您可能想检查循环的语法,以及您期望的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2021-04-24
    • 2021-09-15
    相关资源
    最近更新 更多