我正在为我的C级做一个小练习,我遇到的困难我知道不应该真的发生,因为这些应该花费最多30分钟.到目前为止,这是我的程序:
#include <stdio.h>
#include <stdbool.h>
#define LIMIT 1000000;
bool isPrime( int num ) {
for ( int factor = 2; factor * factor <= num; factor++ )
if ( num % factor == 0 )
return false;
return true;
}
int main() {
for ( int num = 2; num <= LIMIT; num++ ) {
if ( isPrime( num ) ) {
printf( num );
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误:
primes.c: In function “main”:
primes.c:14: error: expected expression before “;” token
primes.c:16: warning: passing argument 1 of “printf” makes pointer from integer without a cast
/usr/include/stdio.h:361: note: expected “const char * restrict” but argument is of type “int”
Run Code Online (Sandbox Code Playgroud)
Iha*_*imi 12
正如@ Inspired所说LIMIT
宏定义中有一个额外的分号,分号将由预处理器扩展,使得该行
for ( int num = 2; num <= LIMIT; num++ ) {
Run Code Online (Sandbox Code Playgroud)
像这样
for ( int num = 2; num <= LIMIT;; num++ ) {
/* ^^ 2 semicolons, now the num++ is extra */
Run Code Online (Sandbox Code Playgroud)
但你的程序还有另一个问题
printf(num);
Run Code Online (Sandbox Code Playgroud)
不会工作,printf()
期望一个格式字符串,然后是参数,所以它应该是
printf("%d\n", num);
Run Code Online (Sandbox Code Playgroud)
读这个
你有一个额外;
的#define LIMIT 1000000;
.
处理时#define
,编译器只执行文本替换:它替换LIMIT
为1000000;
.所以你的for
循环看起来像
for (int num=2; num < 1000000 ;; num++)
^^
Run Code Online (Sandbox Code Playgroud)
发生第二个错误是因为确实printf
要求第一个参数是字符串(格式字符串),而不是整数.例如printf("%d is prime.\n", num);
(%d
是整数值的占位符,并且\n
是行尾).