求助 C 大俠們 ^_^


/*****************************************************
**** 不正確的參數個數和說明符與類型匹配
******************************************************/
#include <stdio.h>
int main (void)
{
    int f = 4;
    int g = 5;
    float h = 5.0f;

    printf ("%d\n", f, g);   
    printf ("%d  %d\n", f);  
    printf ("%d  %f\n", h, g);      /* 這個還能理解 */
printf ("%d  %f\n", 2.56, 3);
printf ("%d  %f\n", 2.56, 3.0); /* 但這個結果為啥和 3 也一樣呢? */ 

    return 0;
}

/***********************************************************************
4
4  0
0  0.000000
1202590843  0.000000  
1202590843  0.000000

1. VS2008編譯運行, codeblocks結
   果也是一樣.

***********************************************************************/


另外問一個題外題: GCC 是不是不支持 long double 型啊?
不然怎么會這樣啊?
                 
long double dip = 5.12e-5;
 printf ("%f can be written %e\n", dip, dip);

/*輸出: -741702364199307670522006497758077(CSDN提示太長)0052783859765225753400538888521762824442656957100 can be written -6.807799e+180 */


謝謝大家了!!!!

19 个解决方案

#1


這個題目是從 C primer plus 里改寫的. 弄了一晚上就這個程序, 淚.......

#2


沒有longdouble這個類型
只有long int之類
浮點數沒有long類型

#3


printf一旦前面的類型不配,后面的結果是不可預見的
另:GCC 當然支持long double的

#4


printf ("%d  %f\n", 2.56, 3.0);像你這種基本上屬於未定義行為,也就是說你壓入的兩個double類型,但是做int,和f來解析,一般來說第1個解析錯誤,后面的就很難保證正確了。

#5


是 GCC 不支持么?
#include <stdio.h>
int main (void)
{
    long double dip = 5.12e-5;

    printf ("%f can be written %e\n", dip, dip);

    return 0;
}
/*-----------------輸出------------------------
0.000051 can be written 5.120000e-005

這個是VS2008的輸出!
-----------------------------------------------*/


引用 2 樓 hnuqinhuan 的回復:
沒有longdouble這個類型
只有long int之類
浮點數沒有long類型

#6


%Lf試下吧

#7


第一個問題跟printf的內部實現有關 可以參考源碼 

printf ("%d  %f\n", 2.56, 3);
printf ("%d  %f\n", 2.5, 3.0);
printf ("%d  %f\n", 2., 3.0); /* 但這個結果為啥和 3 也一樣呢? */ 
printf ("%d  %f\n", 2, 3.0);
//這樣比較的話應該有助於你理解

#8


是不是只能用%e來描述double或者long double 類型數值不能用 float?

引用 3 樓 keiy 的回復:
printf一旦前面的類型不配,后面的結果是不可預見的
另:GCC 當然支持long double的

#9


GCC的輸出:
-0.000000 can be written -2.098539e-019

但是VS2008編譯%lf或者%f都是正常的.
引用 6 樓 pengzhixi 的回復:
%Lf試下吧

#10


糾正一下  應該存在long double 這是這個的精度不知道如何定義  如果是輸出的話就參考double,因為根據不同的系統平台,會有不同的結果

#11


引用 8 樓 nnrroo 的回復:
是不是只能用%e來描述double或者long double 類型數值不能用 float?

不是,可用%Lf

#include <stdio.h>
int main()
{
 long double x=43242343242342.324;
 printf("%Lf\n",x);
}  
 

#12


第一個參數期望的是 int, 你卻給了一個 8-byte 的 float,取走 4-byte 后,后面的4-byte 加再后的
4-byte 做 第二個float 參數解讀

#13


嗯, 這種問題很郁悶啊, 不同的平台結果就是不一樣! 我又是初學者, 又不知道原因! 唉~~~還是謝謝啦! 
引用 10 樓 hnuqinhuan 的回復:
糾正一下  應該存在long double 這是這個的精度不知道如何定義  如果是輸出的話就參考double,因為根據不同的系統平台,會有不同的結果

#14


這就是一個解析的問題,你給的類型不符,那么解析錯誤就很正常。

#15


嗯, 有點明白了! 哪里有關於解析方面的好資料么? 我想多了解了解! 謝謝啦!
引用 14 樓 pengzhixi 的回復:
這就是一個解析的問題,你給的類型不符,那么解析錯誤就很正常。

#16


嗯, 想起來了, 截取了一部分, 所以后續讀取的數據就是亂了! 
引用 12 樓 anyidan 的回復:
第一個參數期望的是 int, 你卻給了一個 8-byte 的 float,取走 4-byte 后,后面的4-byte 加再后的
4-byte 做 第二個float 參數解讀

#17


比方說 你壓入一個double 那么應該壓入8個字節,但是你做int來解析 那么他就可能只讀取前4個字節解析成整數輸出,那么后面的四個字節做其他類型數據進行解析。

#18


知道了! 原來是截取了一部分!
引用 17 樓 pengzhixi 的回復:
比方說 你壓入一個double 那么應該壓入8個字節,但是你做int來解析 那么他就可能只讀取前4個字節解析成整數輸出,那么后面的四個字節做其他類型數據進行解析。

#19


謝謝大家了! 學習了不少東西, 解決了問題, 俺加分, 多多給大家! 哈哈~~要停電了, 速速結貼!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com