0

新问题:但是为什么来自 firstFactorPtr == factor1 的表达式来自 n == number?

有人可以解释一下,这是如何工作的:

返回(因子 == 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 );
 }
4

5 回答 5

1

它返回布尔表达式“因子等于 1”的结果,即,truefalse

这个例程还有一个副作用:它将找到的阶乘存储在标题中的两个 int * 指向的列表中。

本质上,true如果因子是素数,它就会返回——循环一直倒数到“1”——false否则。

于 2013-08-03T18:53:12.133 回答
0

return (factor == 1) 表示“如果因子 == 1 则返回真,如果因子 != 1 则返回假”。如果 'factor' 变量的值一直下降到 1(这意味着它无法找到 'number' 变量的任何因子),则名为 Factor() 的函数将返回 true。如果“因子”没有一直下降到 1,则该函数返回 false,这意味着它能够找到“数字”的至少一个因子。

于 2013-08-03T18:54:21.060 回答
0

factorsqrt2 开始计数。如果有一个因子可以被 整除number,它就会跳出 for 循环。因此factor包含数的除数之一。所以除数由 持有,*firstFactor第二个除数由 持有*secondFactorPtr。请注意,这些与您的 main() 函数传递给的指针相同Factor。因此,在 main() 函数中,您会发现factor1factor2填充了 2 个因子。

如果它没有找到任何大于 1 的因子,则它包含 1 并跳出 for 循环。如果它没有找到因子,那么唯一的因子是 1 和数字本身。

于 2013-08-03T18:54:26.123 回答
0

总结你的Factor功能:

bool Factor( /* ... */ )
{
    int factor;
    /* ... */
    factor = /* some value */;
    /* ... */
    return ( factor == 1 );
}

简单的解释是,如果等于,则表达式( factor == 1 )为真,如果factor不相等1,则为假。该值(真或假)从函数返回。对函数的调用是一个布尔表达式,就像对返回 an 的函数的调用int是一个int表达式一样。这意味着您可以编写如下内容:

/* some computations */
if (factor == 1) {
    /* do something */
}

你可以这样写:

if (Factor( /* arguments */ )) {
    /* do something */
}

在函数内部执行的计算Factor

像 "true" 和 "false" 这样的布尔值只是值,它们可以像任何其他值一样被操纵,比如42or 1.23

但这比这要复杂一些。

==是相等运算符。它没有什么特别之处。像任何其他运算符(+用于加法、/除法等)一样,它接受一个或多个某种类型的操作数并产生某种类型的结果。

+产生其操作数的总和;结果的类型取决于操作数的类型。

==产生类型的结果int。结果是1操作数是否彼此相等,0否则。在这种情况下,操作数factor1是相同的数字类型,int所以比较是有效的;其他标量类型有相当复杂的规则==,但我们在这里不必担心它们。

由于历史原因,结果不是type bool,尽管这样更有意义。直到 1999 年的标准,C 甚至都没有布尔类型。相反,它是 type int。任何标量(整数、浮点或指针)表达式都可以在布尔上下文(ifwhile等)中使用,如果等于则视为假,0否则视为真。

因此,如果 的值factor恰好是1在执行 return 语句时,它将返回该值1

您的Factor函数被定义为返回类型的结果bool,而不是int。因此,表达式的值隐式地从int(由 产生的类型==)转换为bool(函数结果的类型)。该转换的结果很简单1,但是类型bool而不是int. 该值也可以拼写为trued #include<stdbool.h>它定义true为宏。

(其他一些语言从一开始就具有布尔类型。在这种语言中,表达式( factor == 1 )将产生一个布尔值“true”,并且该值将由函数返回,无需转换。行为在概念上是比 C 中发生的更简单,但结果基本相同。当添加到语言中<stdbool.h>时,连同类型_Bool和宏false以及true-in 布尔类型,而不破坏使用int布尔值和操作的其他标量类型的现有代码。)

于 2013-08-03T21:32:19.473 回答
0

简而言之:

 return foo == bar;

相当于

 return foo == bar ? 1 : 0;

因为关系运算符喜欢==产生 0 或 1。这是否清楚?

于 2013-08-03T21:59:33.323 回答