我是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;
为什么变量声明的顺序很重要?
答案 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-*/
)。