2

我是 C 新手,在这里的 StackExchange 和所有其他来源中,0是成功的,否则是false. 在这个打印素数的函数中,为什么它只打印return值为 1 的素数?

就像我去(is_prime(num) == 0),那么它不会打印素数,但如果只是说它is_prime(num)会自动假设(is_prime(num) == 1)

这让我很困惑,请澄清,因为值会在 0 和 1 之间切换,但为什么会自动产生偏差?

int is_prime(int num){
   int isPrime = 1;
   int i;

   for(i = 2; i <= sqrt(num); i++){
      if(num % i == 0){
         isPrime =  0;
      }
   }

   return isPrime;
}
4

2 回答 2

3

我是 C 新手,在这里的 StackExchange 和所有其他来源中,0 是成功,否则是错误的。

那是倒退。在 C 中,0 为假,非零值为真。

if (number)    <==>   if (number != 0)
if (!number)   <==>   if (number == 0)

这在大多数情况下都是正确的,并且是最常见的整数→布尔关系。映射反转的情况有一些例外:

  • 的返回值为main()0 表示成功,非零表示失败。这样做的原因是,如果程序失败,您可能希望通过返回不同的退出代码来区分错误。例如,1 表示“错误的命令行参数”,2 表示“找不到文件”,3 表示“无法连接到服务器”,等等。这些退出代码的含义取决于应用程序。

  • 许多 POSIX 系统调用close()connect()使用相同的想法,返回 0 表示成功,返回 -1 表示错误。对于这些函数,您必须编写if (connect(...) != 0)而不是if (connect(...)).

请注意,这些异常不是 C 语言本身的一部分,而是与常用的 C 函数有关。

于 2013-09-19T19:11:07.377 回答
1

在 if 语句中,或任何正在测试布尔值(真或假)的情况下,在 C 中,至少0表示假,任何非零整数都表示真。

如果由于某种原因,您的 isPrime 函数在-17给定一些 input的情况下返回xisPrime(x)如果将其视为布尔值,则仍将被视为 true,因此如果您在条件为 的 if 块中有一些代码isPrime(x),则该代码将运行,因为-17它是非零的。

于 2013-09-19T19:01:51.123 回答