有人可以解释一下,这是如何运作的:
return(factor == 1);
这返回“main”,“factor == 1”,为什么“isPrime”返回true? 如果我们“* firstFactorPtr”和“* secondFactorPtr”,为什么它会返回false? 它正在搜索素数和非素数 “main”中没有“int factor”,如何用任何表达式返回“main”?
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
bool Factor( int number, int *firstFactorPtr, int *secondFactorPtr );
int main(int argc, const char * argv[])
{
int n;
for ( n = 5; n <= 20; n++ ) {
bool isPrime;
int factor1, factor2;
isPrime = Factor( n, &factor1, &factor2 );
if ( isPrime )
printf( "the number %d is prime\n", n );
else
printf( "the number %d has %d and %d as factors\n", n, factor1, factor2 );
}
return 0;
}
bool Factor( int number, int *firstFactorPtr, int *secondFactorPtr )
{
if ( number < 1 )
return false;
int factor;
for ( factor = sqrt(number); factor > 1; factor-- ) {
if ( (number % factor) == 0 ) {
break;
}
}
*firstFactorPtr = factor;
*secondFactorPtr = number / factor;
return ( factor == 1 );
}
答案 0 :(得分:1)
返回布尔表达式“factor equals 1”的结果,即true
或false
。
此例程也有副作用:它将找到的阶乘存储在标题中两个int *指向的列表中。
本质上,如果因子是素数,则返回true
- 循环一直向下计数到'1' - ,否则为false
。
答案 1 :(得分:0)
return(factor == 1)表示“如果factor == 1则返回true,如果factor!= 1则返回false”。如果'factor'变量的值一直下降到1(意味着它找不到'number'变量的任何因子),则称为Factor()的函数返回true。如果'factor'没有一直降到1,则该函数返回false,这意味着它能够找到至少一个'number'的因子。
答案 2 :(得分:0)
factor
从sqrt
一直向下计数到2.如果有一个可以被number
整除的因子,它就会突破for循环。因此factor
包含数字除数之一。因此除数由*firstFactor
持有,第二除数由*secondFactorPtr
持有。请注意,这些是您的main()函数传递给Factor
的指针。因此,在main()函数中,您会发现factor1
和factor2
填充了2个因素。
如果找不到任何大于1的因子,则它包含1并且跳出for循环。如果没有找到因子,则唯一的事实是1和数字本身。
答案 3 :(得分:0)
总结您的Factor
功能:
bool Factor( /* ... */ )
{
int factor;
/* ... */
factor = /* some value */;
/* ... */
return ( factor == 1 );
}
简单的解释是,如果( factor == 1 )
等于factor
,则表达式1
为真,如果不相等则为假。从函数返回此值(true或false)。对函数的调用是一个布尔表达式,就像对函数的调用一样,它返回一个int
int
表达式。这意味着你可以这样写:
/* some computations */
if (factor == 1) {
/* do something */
}
你可以这样写:
if (Factor( /* arguments */ )) {
/* do something */
}
在Factor
函数内执行计算。
“true”和“false”之类的布尔值只是值,它们可以像42
或1.23
之类的任何其他值一样进行操作。
但它有点复杂。
==
是相等运算符。它没什么特别之处;像任何其他运算符一样(+
用于加法,/
用于除法,等等)它需要一个或多个某种类型的操作数并产生某种类型的结果。
+
产生其操作数的总和;结果的类型取决于操作数的类型。
==
会产生int
类型的结果。如果操作数彼此相等,则结果为1
,如果不相等,则为0
。在这种情况下,操作数factor
和1
具有相同的数字类型int
,因此比较有效; ==
对其他标量类型有相当复杂的规则,但我们不必在此担心它们。
由于历史原因,结果是{em>不类型为bool
,但这会更有意义。在1999年的标准之前,C甚至没有布尔类型;相反,它的类型为int
。任何标量(整数,浮点或指针)表达式都可以在布尔上下文中使用(if
,while
等),如果它等于0
,则视为false。是的,不然。
因此,如果执行return语句时factor
的值恰好为1
,则它将返回值1
。
您的Factor
函数定义为返回bool
类型的结果,而不是int
。因此,表达式的值隐式地从int
(由==
产生的类型)转换为bool
(函数结果的类型)。转化的结果只是1
,但类型为bool
,而不是int
。该值也可以拼写为true
,因为您#include
d <stdbool.h>
将true
定义为宏。
(其他一些语言从一开始就有一个布尔类型。在这种语言中,表达式( factor == 1 )
将产生一个布尔值“true”,该值将由函数返回,没有转换必要。行为在概念上比在C中发生的行为更简单,但结果基本相同。当<stdbool.h>
被添加到语言时,以及类型_Bool
和宏{{} 1}}和false
,它的编写方式很方便,可以编写使用新的内置布尔类型的代码,而不会破坏使用true
的现有代码或布尔值和操作的其他标量类型。)
答案 4 :(得分:0)
简而言之:
return foo == bar;
相当于
return foo == bar ? 1 : 0;
因为像==
这样的关系运算符会产生0或1.这是否清楚了?