使用%d而不是%f时分配给s变量的值

时间:2017-02-26 10:25:20

标签: c programming-languages

我假设输出为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);
}

2 个答案:

答案 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.60}只会给你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