是" is_linux"变量有特殊含义吗?

时间:2017-05-31 07:22:02

标签: c variables

我不明白为什么以下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编译了上述源代码。

4 个答案:

答案 0 :(得分:5)

在您的代码中

  sscanf(str,"%d",&is_linux);

导致undefined behavior

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可以涵盖所有整数数据类型。 无论如何,我非常感谢你们所有人的评论。谢谢:))