我的简单C程序没有编译

时间:2015-01-17 19:59:20

标签: c

我正在为我的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;
}

以下是我遇到的错误:

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”

3 个答案:

答案 0 :(得分:12)

由于@ Inspired表示在LIMIT宏定义中有一个额外的分号,分号将由预处理器扩展而构成该行

for ( int num = 2; num <= LIMIT; num++ ) {
像这样

for ( int num = 2; num <= LIMIT;; num++ ) {
                            /* ^^ 2 semicolons, now the num++ is extra */

但你的程序还有另一个问题

printf(num);

不起作用,printf()需要一个格式字符串,然后是参数,所以它应该是

printf("%d\n", num);

阅读this

答案 1 :(得分:6)

;中有额外的#define LIMIT 1000000;

处理#define时,编译器只执行文本替换:它将LIMIT替换为1000000;。所以你的for循环看起来像

for (int num=2; num < 1000000 ;; num++) 
                              ^^

发生第二个错误是因为确实printf期望第一个参数是字符串(格式字符串),而不是整数。例如。 printf("%d is prime.\n", num);%d是整数值的占位符,\n是行尾。)

答案 2 :(得分:3)

LIMIT定义后没有分号。处理器指令不会得到它们,因此它实际上将"100000;"复制到for循环中。

printf的第一个参数应该是格式字符串"%d",所以printf("%d\n", num)

你会习惯的简单东西(在不思考的时候仍然会陷入困境),但如果你只是在学习,它看起来很棒。远远超过我的第一个C程序。