我已经为分配创建了宏,但找不到运行程序时遇到的语法错误。非常感谢任何想法,谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define ODD(X) ((X) & 01)
#define BITON(X,N) (((X) >> N) & 01)
#define ALLON(X,S,E) (((X) & ((((int) pow(2,(E-S))-1) << (E-S))) ^ (((int) pow(2,E-S)-1) << (E-S)))
//-----------------------------------------------------------------------------
int main(void) {
unsigned int U1,BitNumber,Start,End;
printf("Enter an integer : ");
scanf("%ud",&U1);
printf("%u is %s\n",U1,ODD(U1)?"odd":"even");
printf("Enter an integer and a bit number : ");
scanf("%u %d",&U1,&BitNumber);
printf("%u has bit %d %s\n",U1,BitNumber,BITON(U1,BitNumber)?"on":"off");
printf("Enter an integer, start and end bit numbers : ");
scanf("%u %u %u",&U1,&Start,&End);
printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End)?"all":"not all");
return(EXIT_SUCCESS);
}
//-----------------------------------------------------------------------------
错误:
BitOps.c: In function ‘main’:
BitOps.c:23:77: error: expected ‘)’ before ‘;’ token
printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End)?"all":"not all");
^
BitOps.c:26:1: error: expected ‘;’ before ‘}’ token
}
答案 0 :(得分:1)
ALLON
的宏定义中有一个额外的左括号。编译器在使用ALLON
的行末尾到达分号之前不能确定它是错的,因此错误消息会抱怨该行(这很好)而不是{{{{}}的定义。 1}},但ALLON
的定义是问题所在。
答案 1 :(得分:0)
启用-Wall
标志并编译代码,其内容非常丰富,不要忽略它。
01
替换为实际目的的0x1
。BitNumber
声明为unsigned
,但使用%d
格式说明符。使用-Wall
标志编译代码。ALLON()
宏扩展不正确,我在下面正确添加。预计会有一个
#define ODD(X) ((X) & 0x1)
#define BITON(X,N) (((X) >> N) & 0x1)
#define ALLON(X,S,E) (((X) & ( ((((int) pow(2,(E-S))-1) << (E-S))) ^ (((int) pow(2,E-S)-1) << (E-S)))) )
int main(void) {
unsigned int U1,BitNumber,Start,End;
printf("Enter an integer : ");
scanf("%u",&U1);
printf("%u is %s\n",U1,ODD(U1)?"odd":"even");
printf("Enter an integer and a bit number : ");
scanf("%u %u",&U1,&BitNumber);
printf("%u has bit %d %s\n",U1,BitNumber,BITON(U1,BitNumber)?"on":"off");
printf("Enter an integer, start and end bit numbers : ");
scanf("%u %u %u",&U1,&Start,&End);
printf("%u has %s those bits on\n",U1,ALLON(U1,Start,End) ?"all":"not all");
return(EXIT_SUCCESS);
}