1

我试图在 C 中编写一个代码来检查一个数字是否是奇数而不使用模运算符,但是在尝试编译时我一直遇到这个错误:

20:错误:预期的“)”

(我通过注释在代码块中指出了第 20 行。它在“else”之后)

#include <stdio.h>

/* check if number is odd or even */

/* something like n = 1111 1110 | x
 * results in n = 1111 1111 if last bit of x is 1
 * hence, if ~n = 0 then number is odd */
int truth;

int main()
{
    void oddoreven(int 3);

    if (truth)
        printf("even");
    else //this is line 20. 
        printf("odd");

    return 0;
}

void oddoreven(int p)
{
    truth = -126 | p;
    truth = ~truth;
}
4

6 回答 6

3

这是一个具有固定逻辑和语法的工作程序。

#include <stdio.h>

/* check if number is odd or even */

/**
 * returns 1 if number is odd, 0 otherwise
 */
int oddOrEven(int p)
{
    return (1 & p);
}

int main()
{
    
    if (oddOrEven(3))
        printf("Odd");
    else
        printf("Even");

    return 0;
}

语法变化:

  • 函数oddOrEven()移到之前main()。您也可以编写函数原型并将定义保留在原始位置。
  • 改为。void oddoreven(int 3);_ oddOrEven(3)这是函数调用的正确语法。

逻辑解释:

你写了

像 n = 1111 1110 | 如果 x 的最后一位为 1,则 x 导致 n = 1111 1111 因此,如果 ~n = 0 则数字为奇数

但是,
这取决于您的整数类型的大小。
n = 1111 1110 | x结果是n = 0011 1111 1111if 。 对于,仅当 的大小为 8 位时。x0011 1100 1111
n = 1111 1111~n = 0n

在二进制中,数字1表示一定数量的零,末尾为 1。
&是按位和运算符。
因此,
1 & n当且仅当 x 的最后一位为 1 时,结果为 1。

于 2021-05-07T06:12:52.817 回答
2

我没有得到你提到的错误。
我收到线路错误

void oddoreven(int 3);

您在其中混合原型和函数调用。

您可以通过正确定义和调用函数来修复。

#include <stdio.h>

/* check if number is odd or even */

/* something like n = 1111 1110 | x
 * results in n = 1111 1111 if last bit of x is 1
 * hence, if ~n = 0 then number is odd */
int truth;


void oddoreven(int p)
{
    truth = -126 | p;
    truth = ~truth;
}
int main(void)
{
    oddoreven(3);

    if (truth)
        printf("even");
    else //this is line 20. 
        printf("odd");

    return 0;
}

即在 main 之前定义函数,这样可以节省你明确地做原型。
在 main 内部调用函数而不是声明它。即使用 3 作为参数,没有类型并删除返回类型。这使它成为一个电话。

于 2021-05-07T05:51:34.183 回答
2

你有多个错误第一个是你不能调用这样的函数,它应该是oddoreven(3);3 已经是一个整数,你不需要数据类型。

下一个是你必须在函数上面声明函数,如果你要写在主函数下面,或者你可以直接写在主函数上面。

你的逻辑似乎也错误使用这样的东西

#include <stdio.h>



int oddoreven(int p)
{
    if ( p & 1 == 1 )
      return 0;
   else
      return 1;
    
}

int main()
{

    if (oddoreven(4))
        printf("even");
    else //this is line 20. 
        printf("odd");

    return 0;
}

并更改您的代码

#include <stdio.h>

/* check if number is odd or even */

/* something like n = 1111 1110 | x
 * results in n = 1111 1111 if last bit of x is 1
 * hence, if ~n = 0 then number is odd */
int truth;
void oddoreven(int p)
{
    truth = -126 | p;
    truth = ~truth;
}

int main()
{
    oddoreven(3);

    if (truth)
        printf("even");
    else //this is line 20. 
        printf("odd");

    return 0;
}
于 2021-05-07T05:56:56.333 回答
1

您需要更改void oddorevern(int 3)为. 调用函数时,不需要附加. 此外,在 C 中,您需要在调用它之前声明一个函数。mainoddoreven(3)void

#include <stdio.h>

/* check if number is odd or even */

/* something like n = 1111 1110 | x
 * results in n = 1111 1111 if last bit of x is 1
 * hence, if ~n = 0 then number is odd */
int truth;

void oddoreven(int p)
{
    truth = -126 | p;
    truth = ~truth;
}

int main()
{
    oddoreven(3);

    if (truth)
        printf("even");
    else //this is line 20. 
        printf("odd");

    return 0;
}

像这样

于 2021-05-07T05:51:25.760 回答
1

在您的代码中

 void oddoreven(int 3);

是一种函数声明语法,你只能使用参数作为类型和变量。所以

  • 正确的语法是

      void oddoreven(int);
    
  • 正确的地方是外面和之前main()

如果你想进行函数调用,你必须这样做

oddoreven(3);
于 2021-05-07T05:52:01.693 回答
1

首先应该在调用函数之前编写oddoreven() 的函数定义。即使您正在编写函数oddoreven() 的定义,也必须在调用函数之前编写函数原型。通过这种方式,编译器知道函数定义。

此外,调用函数 oddoreven() 的语法也是错误的。

更改 void oddoreven(int 3);oddoreven((int)3);oddoreven(3);

完整代码:

#include <stdio.h>

int truth;

void oddoreven(int p)
{
    truth = -126 | p;
    truth = ~truth;
}
int main()
{
    oddoreven((int)3);

    if (truth)
        printf("even");
    else //this is line 20. 
        printf("odd");
    return 0;
}
于 2021-05-07T06:03:41.107 回答