C错误:在'之前应为表达式;{';代币

C错误:在'之前应为表达式;{';代币,c,C,这是密码 编译器给了我上面的错误,错误是什么? 谢谢(: 以下是可立即阅读的代码: #include <stdio.h> #define round(a) { \ if(a < 0) \ ((a + 0.5) < (int)a)? (int)a: (int)a + 1; \ else \ ((a - 0.5) < (int)a)? (int)a: (int)a + 1; \ }

这是密码

编译器给了我上面的错误,错误是什么? 谢谢(:

以下是可立即阅读的代码:

#include <stdio.h>
#define round(a) {    \
    if(a < 0)    \
        ((a + 0.5) < (int)a)? (int)a: (int)a + 1;    \
    else        \
        ((a - 0.5) < (int)a)? (int)a: (int)a + 1;    \
}

#define ARRLENG 8 /* array length */

/* function prototype */
void arrRounder(double[ARRLENG]);

int main()
{
    double arr[ARRLENG] = {2.13, 6.9, 9.49999, 0.5, 8.0, 0, -2.4, -2.5};
    arrRounder(arr);
    return 0;
}

void arrRounder(double arr[ARRLENG])
{
    int i = 0;

    for(i = 0; i < ARRLENG; i++)
        arr[i] = round(arr[i]);

    for(i = 0; i < ARRLENG; i++)
        printf("%lf\n", arr[i]);
}
#包括
#定义第(a)轮{\
if(a<0)\
((a+0.5)<(int)a)?(int)a:(int)a+1\
否则\
((a-0.5)<(int)a)?(int)a:(int)a+1\
}
#定义ARRLENG 8/*数组长度*/
/*功能原型*/
空心倒棱器(双[倒棱]);
int main()
{
双arr[ARRLENG]={2.13,6.9,9.49999,0.5,8.0,0,-2.4,-2.5};
arr(arr);
返回0;
}
空棱轮(双棱[棱])
{
int i=0;
对于(i=0;i
您的
round()
宏实际上是语句和表达式的混合体,这是不允许的


或者你应该将
if
转换成另一个三元运算符-这使得整个内容更不可读-或者你应该将它转换成一个函数。

预处理器用宏体逐字替换
rounder
。因此你会有一行

arr[i] = { ... };
这不是一个有效的C语句


宏调用可能看起来像函数调用,但事实并非如此。

根据我的说法,您应该使用简单的大括号而不是大括号。请查看定义宏的语法。

假设您当前的舍入算法是正确的,则在表达式形式中也会执行相同的操作:

#define round(a) (((a) + ((a) < 0 ? 0.5 : -0.5) < (int)(a))? (int)(a): (int)(a) + 1)
#定义圆(a)((a)+(a)<0?0.5:-0.5)<(int)(a))?(int)(a):(int)(a)+1)
请注意
a
周围的所有附加括号,以防它是一个未加密的表达式。这是宏中的最佳(必要)实践。

包括
#include <stdio.h>
/*macro*/
#define round(a) (((a - (int)a) < 0.5) ? (int)a : (int)(a + 1))
/*const*/
#define ARRLENG 8 /* array length */

/* function prototype */
void arrRounder(double[ARRLENG]);

/*main*/
int main()
{
    double arr[ARRLENG] = {2.13, 6.9, 9.49999, 0.5, 8.0, 0, -2.4, -2.5};
    arrRounder(arr);
    return 0;
}

/*function declaration*/
void arrRounder(double arr[ARRLENG])
{
    int i = 0;

    for(i = 0; i < ARRLENG; i++)
        arr[i] = round(arr[i]);

    for(i = 0; i < ARRLENG; i++)
        printf("%lf\n", arr[i]);
}
/*宏*/ #定义第(a)轮(((a-(int)a)<0.5)?(int)a:(int)(a+1)) /*常数*/ #定义ARRLENG 8/*数组长度*/ /*功能原型*/ 空心倒棱器(双[倒棱]); /*主要*/ int main() { 双arr[ARRLENG]={2.13,6.9,9.49999,0.5,8.0,0,-2.4,-2.5}; arr(arr); 返回0; } /*函数声明*/ 空棱轮(双棱[棱]) { int i=0; 对于(i=0;i

我没有在其他数字中尝试过此代码,但应该可以正常工作。请尝试找到一种方法避免使用强制转换运算符
(int)
,因为可能会产生不可预测的结果。

仔细查看您的回合()宏及其使用方法。多行宏不是坏事吗?改用函数不是更好吗?作为函数编写很可能是由优化器从任何合理的编译器中内联的。我不确定您希望通过将其作为宏编写来获得什么,但出于理智,暂缓这种希望,只编写一个函数。怎么了在math.h中使用round()函数?在这里没有帮助,如果没有其他更改。什么是“根据我”?什么是“简单括号”?你是指括号吗?如果是,你没有给出足够的细节。好的,很抱歉。简单括号的意思是“()”。我们可以用括号代替curley来定义宏。例如:#定义MAX(a,b)((a)>(b)?(a):(b))“谢谢!练习是制作一个将双精度整数舍入为最接近整数的宏,然后制作一个使用该宏对整个数组进行舍入的函数。因此该宏是必须的,我不能用函数替换它。那么我如何才能做到这一点,使其可读且无错误?无需将整个if/else转换为?:因为实体是几乎一样。看我的答案。我的错,这个解决方案不考虑负数,我现在看到了吉姆·鲍尔特的答案。