为什么变量声明的顺序?

时间:2015-05-26 10:58:29

标签: c

我是C的新手,我有一个小函数,它读取一个简单的数学运算(+, - ,*,/)的输入,然后相应地计算结果并返回-nan如果输入是不正确。

float simple_math(void) {
float a, b;
int char_c;
int ret_a;


ret_a = scanf("%f %c %f", &a, &char_c, &b);
float result;

if (char_c == '+')
    result = a + b;
else if (char_c == '-')
    result = a - b;
else if (char_c == '*')
    result = a * b;
else if (char_c == '/')
    result = a / b;
else
    result = 0.0 / 0.0;

return result;
}

这段代码很好用。但是,如果我更改前两行的顺序,则返回值为-nan。

int char_c;
float a, b;   // this was originally the first line
int ret_a;

为什么变量声明的顺序很重要?

2 个答案:

答案 0 :(得分:10)

int char_c;

应该是

char char_c;

%c用于扫描字符而非int,因此您的scanf将导致未定义的行为。

未定义行为的副作用有时会按预期工作。所以请摆脱未定义的行为,它与变量定义的顺序无关。

答案 1 :(得分:5)

这是你的问题:

int char_c;

ret_a = scanf("%f %c %f", &a, &char_c, &b);

您在这里告诉scanf阅读char,但请传递int。这导致scanf只读取char(1byte)的大小而不是int的大小(大于字节),所以最后,char_c中包含的内容是随机的和definitiveley中没有四个允许的字符(x-*/)。