C 当变量类型不同时,为什么下面的代码给出不同的输出? //当i/p为16,2为4,如果变量为int,则o/p为20; #定义SETBIT(A,B)A | 1

C 当变量类型不同时,为什么下面的代码给出不同的输出? //当i/p为16,2为4,如果变量为int,则o/p为20; #定义SETBIT(A,B)A | 1,c,char,int,bit,C,Char,Int,Bit,对于*scanf函数,d转换说明符期望其相应参数具有类型int*;如果不是这样,那么行为是未定义的,几乎任何结果都是可能的 如果要对pos和n使用char,则必须在scanf调用中使用%hhd而不是%d scanf(“%d”和&n)格式说明符与数据类型不匹配,另一个scanf也不匹配。scanf(“%d”,&n)与char n一起产生未定义的行为。同样适用于scanf(“%d”和&pos)。实际上,scanf将4个字节的数据写入一个大小为1字节的变量(虽然这些大小通常不受语言标准的限制,但在大多

对于
*scanf
函数,
d
转换说明符期望其相应参数具有类型
int*
;如果不是这样,那么行为是未定义的,几乎任何结果都是可能的


如果要对
pos
n
使用
char
,则必须在
scanf
调用中使用
%hhd
而不是
%d

scanf(“%d”和&n)
格式说明符与数据类型不匹配,另一个
scanf
也不匹配。
scanf(“%d”,&n)
char n
一起产生未定义的行为。同样适用于
scanf(“%d”和&pos)
。实际上,
scanf
将4个字节的数据写入一个大小为1字节的变量(虽然这些大小通常不受语言标准的限制,但在大多数平台上都是这样)。您需要决定要从键盘扫描哪种类型的数据。使用
“%d”
-使用
int
。对于
char
-使用
“%c”
。请提交格式化的code@WeatherVane我想你的意思是|1@WeatherVane所有宏参数都应在宏中加括号。
SETBIT(1,2 | 4)
的结果可能与
SETBIT(1,6)
的结果不同,但输出仍然相同。
//o/p when i/p is 16 and 2 is 4 and if  variable is int then o/p will be 20;   

#define SETBIT(A,B) A|1<<B

int main(){
    char n,pos;
    printf("Enter a value");
    scanf("%d",&n);
    printf("Enter position");
    scanf("%d",&pos);
    printf("Value after setting %d",SETBIT(n,pos));
}