我不明白为什么以下if
声明的结果始终不正确:
unsigned long is_linux;
printf("plz. enter a digit : ");
gets(str);
sscanf(str,"%d",&is_linux);
printf("the value of is_linux = %d \n",is_linux);
if(is_linux==1)
printf("Here is 1 ! \n");
else
printf("There is 0 ! \n");
我只能得到"有0!"声明,即使我进入" 1"。此外,printf()
语句正确显示is_linux
(1)的值:
plz. enter a digit : 1 the value of is_linux = 1 There is 0 !
如果我将变量更改为其他名称,例如test
,则效果很好。有没有理由不使用is_linux
变量?我在gcc
使用x86_64-redhat-linux
编译了上述源代码。
答案 0 :(得分:5)
在您的代码中
sscanf(str,"%d",&is_linux);
is_linux
的类型为unsigned long
,它要求转化说明符为lu
。
将错误(不匹配)类型的参数传递给任何转换说明符会导致undefined behavior。
答案 1 :(得分:0)
没有。您应该能够使用变量名称。 is_linux
不是保留的,也不是关键字。最糟糕的情况是,它可能(但不应该)是一个宏(遗憾的是linux
)。抢先一步,或者如果因为它是您平台上的宏而遇到编译错误,您可以先#undef
。
(确保代码的其余部分正确无误。)
答案 2 :(得分:0)
您分配给is_linux的数据类型不兼容。你将它设置为long,但是给它一个int,所以当你检查if语句时,你要检查一个long值,而不是int。
答案 3 :(得分:0)
非常感谢你。 所有评论都对我找到根本原因非常有帮助。 实际上,这是非常简单的原因,数据类型。 简单地说,我在sscanf和printf中都将%d更改为%lu并得到了正确答案。
我的机器是64位lunux系统,它将无符号长度视为8字节单位。 而且,我误解了%d可以涵盖所有整数数据类型。 无论如何,我非常感谢你们所有人的评论。谢谢:))