返回如何在这里工作?

时间:2013-08-03 18:44:41

标签: c int boolean return

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

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

  

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 );
 }

5 个答案:

答案 0 :(得分:1)

返回布尔表达式“factor equals 1”的结果,即truefalse

此例程也有副作用:它将找到的阶乘存储在标题中两个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)

factorsqrt一直向下计数到2.如果有一个可以被number整除的因子,它就会突破for循环。因此factor包含数字除数之一。因此除数由*firstFactor持有,第二除数由*secondFactorPtr持有。请注意,这些是您的main()函数传递给Factor的指针。因此,在main()函数中,您会发现factor1factor2填充了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”之类的布尔值只是值,它们可以像421.23之类的任何其他值一样进行操作。

但它有点复杂。

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

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

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

由于历史原因,结果是{em>不类型为bool,但这会更有意义。在1999年的标准之前,C甚至没有布尔类型;相反,它的类型为int。任何标量(整数,浮点或指针)表达式都可以在布尔上下文中使用(ifwhile等),如果它等于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.这是否清楚了?