我假设输出为8但是行s = a + b将值5赋值给s变量而不是a + b的总和。我知道我使用%d而不是%f。
#include <stdio.h>
void summ(int, int);
int main(){
int a = 3, b = 5;
summ(a, b);
return 0;
}
void summ(int a, int b){
float s;
s = a + b;
printf("%d", s);
}
答案 0 :(得分:1)
您无法在printf()
中使用任何旧的格式说明符。它总是必须匹配您传入的变量的类型。如果要将值打印为另一种类型,则必须先将其转换,然后打印转换后的值。所以这要么是:
void summ(int a, int b)
{
float s;
s = a + b;
printf( "%f\n", s );
}
或
void summ(int a, int b)
{
int s;
s = a + b;
printf( "%d\n", s );
}
如果你的总和功能,你不会看到明显的差异(除了%d
没有打印&#34; .0000&#34;在数字之后,你可能有通过将0
的长度%f
添加到%.0f
的一小部分,将其写为void divv(int a, int b)
{
float s;
s = a / b;
printf( "%f\n", s );
}
来抑制它。
OTOH,如果你有分工:
3 / 5
CPU将执行(通常更快)整数除法。这意味着0.6
(0
}只会给你int
因为它没有计算分数。编译器没有查看表达式分配的变量类型,因此它没有看到它实际上可以存储分数。它只是查看运算符的操作数,它们都是int
,计算float
,并将其展开为void divv(int a, int b)
{
float s;
s = (float)a / (float)b;
printf( "%f\n", s );
}
。因此,如果您想要一个精确的结果,您必须这样做:
float
因为只要其中一个参数是%{
#include <iostream>
#include <string>
using namespace std;
static bool error = false;
static string buffer;
%}
HEX "-"?"0"[xX][0-9A-F]+
EOL (\n|\r|\r\n)
%%
{HEX} { buffer += yytext; }
" " { /* ignore spaces */ }
. { buffer += yytext; error = true; }
{EOL}+ {
cout << buffer << '\t' << (error ? "not valid" : "valid") << endl;
buffer.clear();
error = false;
}
%%
int main(int argc, char **argv) { return yylex(); }
int yywrap() { return 1; }
,它就会执行浮点除法并计算分数。
答案 1 :(得分:0)
这是一个可能的代码版本,可以干净地编译并执行所需的功能。
#include <stdio.h>
void summ(int, int);
int main( void )
{
int a = 3;
int b = 5;
summ(a, b);
return 0;
} // end function: main
void summ(int a, int b)
{
float s;
s = (float)(a + b);
//printf("%d", s);
printf( "%f\n", s );
} // end function: summ
以上代码的输出是:
8.000000