我想知道当 if(i%2) 检查啥来继续时会发生啥。它错过了 == 但将总和打印为 20?为啥?

Posted

技术标签:

【中文标题】我想知道当 if(i%2) 检查啥来继续时会发生啥。它错过了 == 但将总和打印为 20?为啥?【英文标题】:I wonder whats happens when if(i%2) what does it checks to come to continue. It misses == but it prints out the sum as 20? Why?我想知道当 if(i%2) 检查什么来继续时会发生什么。它错过了 == 但将总和打印为 20?为什么? 【发布时间】:2015-06-29 17:11:21 【问题描述】:
#import <stdio.h>
int main(void) 
    int sum,i;
    sum = 0;
    for(i=0;i<10;i++) 
        if(i%2)
            continue;
        sum+=i;
    
    printf("\n%d",sum);
    return 0;

if(i%2) 在上述代码中是如何工作的?

【问题讨论】:

if(i%2) 等价于if(i%2 != 0) 【参考方案1】:

在计算中,模运算求一个数除以另一个数后的余数(有时称为模数)。% 是模数运算符。

所以 i%2 返回 i 除以 2 后的余数。 因此,如果 i 是奇数,则 i%2=1(TRUE) 否则为 0(FALSE)。(偶数条件)

因此,如果 i 是偶数,则将 i 添加到 sum 中,否则循环继续。

【讨论】:

在 if(i%2) 中是 0 一些真实的陈述 在 C 中,true 由任何不等于 0 的数值表示,false 由 0 表示。@user3704516【参考方案2】:

如果条件只知道TRUEFALSE

如果您的modulo 操作产生true 条件,那么它将执行continue。否则它会求和。

**真条件 = 任何不带零的数字(0)

【讨论】:

【参考方案3】:

这里使用的% 称为modulo operator。它检查除法的余数。

关于if 声明,C11 标准说,来自章节§6.8.4.1

语法if表达式)语句

...如果表达式比较不等于0,则执行第一个子语句。

所以,对于像if(i%2) 这样的语句,结果

为 TRUE,当 i 值不是 2 的倍数时,即产生非零余数,因此遇到 continue;。 为 FALSE,当 i 完全可被 2 整除时。因此,continue; 被跳过并 sum+=i; 被执行。

也就是说,C中没有#import &lt;stdio.h&gt;,应该是#include &lt;stdio.h&gt;

最后,

if(i%2) 在上述代码中是如何工作的?

它用于将所有偶数个数相加到9。然后打印出结果20

【讨论】:

但在 if 语句中,在 if 语句中会变成真的 @user3704516 抱歉,我没有理解您的评论。【参考方案4】:

if 语句中的条件

if ( i % 2 ) 

等价于

if ( i % 2 != 0 ) 

如果 i 是奇数,则此条件为真。 所以程序在[0, 10 )范围内求偶数之和

根据 C 标准(6.8.4.1 if 语句)

2 在这两种形式中,第一个子语句被执行 如果 表达式比较不等于 0

这里的“第一个子语句”是指 if 语句(如果存在 else 则它是第二个子语句)。

最好在没有break语句的情况下重写循环。例如

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

    if ( i % 2 == 0 ) sum += i;

和这个一样

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

    sum += i;

【讨论】:

以上是关于我想知道当 if(i%2) 检查啥来继续时会发生啥。它错过了 == 但将总和打印为 20?为啥?的主要内容,如果未能解决你的问题,请参考以下文章

当 UIView 被隐藏时会发生啥?

当两个应用监控同一个 iBeacon 区域时会发生啥?

当两个或多个哲学家检查互斥锁为 1 并同时关闭互斥锁并进入测试函数时会发生啥

JVM 终止时会发生啥?

当一个方法没有被声明为 public、private 或 protected 时会发生啥? [复制]

Collection.Contains() 使用啥来检查现有对象?