我想知道当 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】:如果条件只知道TRUE
或FALSE
。
如果您的modulo
操作产生true
条件,那么它将执行continue
。否则它会求和。
**真条件 = 任何不带零的数字(0)
【讨论】:
【参考方案3】:这里使用的%
称为modulo operator。它检查除法的余数。
关于if
声明,C11
标准说,来自章节§6.8.4.1
语法:
if
(表达式)语句
和
...如果表达式比较不等于0,则执行第一个子语句。
所以,对于像if(i%2)
这样的语句,结果
i
值不是 2 的倍数时,即产生非零余数,因此遇到 continue;
。
为 FALSE,当 i
完全可被 2 整除时。因此,continue;
被跳过并
sum+=i;
被执行。
也就是说,C
中没有#import <stdio.h>
,应该是#include <stdio.h>
最后,
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?为啥?的主要内容,如果未能解决你的问题,请参考以下文章
当两个或多个哲学家检查互斥锁为 1 并同时关闭互斥锁并进入测试函数时会发生啥