1樓:
顯而易見,得出
結論一:這是一種非常危險的程式設計習慣。
結論二:這是乙個非常有效的探索編譯器的測試程式。
結論三:程式設計師實際中是不會寫這樣的程式的!
很顯然,輸出結果取決於編譯器:
vc++6.0 和 vs2010
5 5 4
3 3 3
linux下gcc編譯器
5 5 5
5 4 3
接下來,我們分組討論:
第一: printf("%d %d %d\n", i, ++i, ++i);
對vc++6.0和vs2010
顯然,編譯器識別了:++在前,要先進行++運算,再將運算結果輸出,即輸出i的值。
需要注意的是:
它是從右往左,做一次++,i = 4作為乙個輸出結果壓入棧;然後,再做乙個++, i = 5作為乙個結果壓入棧;這個特點非常明顯。
先算第二個 ++i ,得到4,存入棧
再計算第乙個 ++i ,得到5,存入棧
最後,先輸出5,再是依次彈棧取值5 ,4,實現輸出:5 5 4
一句話:先++,多個++,乙個乙個來。乙個++,一次入棧,乙個結果。
對linux下的gcc
顯然,編譯器識別了:++在前,要先對變數進行++運算,在將運算結果輸出。
需要注意的是:
它也是從右往左,直接就是先進行 兩次 ++ 運算,因為是自增以後在入棧,所以,i = 5,然後,將2個5依次壓入棧,這是它的特點。
最後,先輸出5,再是依次彈棧取值5 ,5,實現輸出:5 5 5
一句話:先++,多個++,一次性搞完全部++。
第二: printf("%d %d %d\n", j, j++, j++);
對vc++6.0和vs2010
顯然,編譯器識別了:++在後,沒有需要在printf前,進行運算。所以,先全部輸出y,再乙個乙個++運算。
一句話:printf所有y,再搞完所有的++。
對linux下的gcc
顯然,編譯器識別了:++在後,沒有需要在printf前,進行運算。所以,從右到左,乙個乙個來。每個都是先 printf 輸出 y ,再++運算。
先將最後乙個y值, 3,入棧,再進行++,y = 4;
再將第二個y值, 4,入棧,在進行++,y = 5;
最後,先輸出5,再是依次彈棧取值4,3,實現輸出:5 4 3
一句話:乙個乙個來,每個都是先printf,再++
很好,分析完畢,重複我們得出的結論:
結論一:這是一種非常危險的程式設計習慣。
結論二:這是乙個非常有效的探索編譯器的測試程式。
結論三:程式設計師實際中是不會寫這樣的程式的!
2樓:倒霉熊
printf 格式符後面的引數都是 從後往前運算的,例如第乙個 i那個,先計算最後 的 ++i,是先讓i+1,然後再使用,所以輸出為4
倒數第二個++i,同理輸出為5
倒數第三個的i 就是5了
下面的j同理
3樓:韓日希
3,4,5
3,3,4
這樣對嗎?如果我沒記錯的話,我學完基本語法就沒碰過c了。
乙個先加,乙個後加。
4樓:
其實這種的沒有必要扣這麼細,這種用法在實際程式設計中很少很少用
5樓:倫悅宜
5 5 4
5 4 3
乙個c語言細節問題。
6樓:匿名使用者
想知道能不能,最簡單的辦法,把樣本擴大到十萬級以上,兩個程式分別執行,拿秒錶掐時間
c語言問題,找不到細節錯誤?
7樓:紫薇參星
你的c語言程式的問題是在字母超出26個時,除了需要將字母重置為'a',還需要將其列印出來並加1
改完的c語言程式如下(改動的地方見注釋)
#include
int main()
int i,row,j,m,n;
m=10;
n=10;
char a;
a='a';
for(row=1;row<=17;row++)for(i=1;i<=19;i++)
if(i>=m&&i<=n)
if(a=='[')elseelseelse if(row>=9){m=m+1;
n=n-1;
printf("\n");
return 0;
另外,我給你乙個我寫的更簡潔的程式,你看看吧#include
#include
int main()
int i,j,n=9,count=0;
for(i=1;i<=2*n-1;i++){for(j=1;j<=abs(n-i);j++){printf("+");
for(j=1;j<=2*n-1-2*abs(n-i);j++){printf("%c",(char)('a'+count++%26));
for(j=1;j<=abs(n-i);j++){printf("+");
printf("\n");
return 0;
8樓:匿名使用者
有一種情況下少輸出了乙個 if(a=='[')a='a'
這個時候a沒有輸出
把下面的else去掉就可以了
任何情況下都輸出a的值
c語言細節問題
9樓:來自杏花村大氣的木星
《c primer plus》這本書中有說明,你搞來仔細去看看。
scanf()輸入double時,必須使用%lf,否則得到的是乙個隨機數。此時跟3相比較,當然不相等。
scanf()輸入float時,使用%f。
使用printf()輸出double或float時,都可以使用%f
10樓:梧桐
scanf()輸入double型資料x時,輸入格式為scanf("%lf",&x),注意,這裡使用的是%lf輸入資料型別為float時,使用的是%f
11樓:求學解惑
浮點數直接與整形數比較沒有意義,因為浮點數存在精度問題
詢問乙個c語言的細節問題
12樓:匿名使用者
a 正確
b正確,沒有形參
c正確,原型中可以省略形參名
d錯誤,形參無型別
很簡單的c語言細節問題,幫我看看下面**。
13樓:吻使
本來以為這個很簡單,沒想到這個真的挺麻煩的。查了下資料,自己才搞懂。
eof作為檔案結束符時的情況:
eof雖然是檔案結束符,但並不是在任何情況下輸入ctrl+z都能夠實現檔案結束的功能,只有在下列的條件下,才作為檔案結束符。
(1)遇到getcahr函式執行時,要輸入第乙個字元時就直接輸入ctrl+z,就可以跳出getchar(),去執行程式的其他部分;
(2)在前面輸入的字元為換行符時,接著輸入ctrl+z;
(3)在前面有字元輸入且不為換行符時,要連著輸入兩次ctrl+z,這時第二次輸入的ctrl+z起到檔案結束符的功能,至於第一次的ctrl+z只能起到行結束的作用。
eof作為行結束符時的情況,這時候輸入ctrl+z並不能結束getchar(),而只能引發getchar()提示下一輪的輸入。這種情況主要是在進行getchar()新的一行輸入時,當輸入了若干字元(不能包含換行符)之後,直接輸入ctrl+z,此時的ctrl+z並不是檔案結束符,而只是相當於換行符的功能,即結束當前的輸入。
不知道你明白了沒有。還有你輸出陣列的值結束後的那個getchar是多餘的。那樣子會把你第二次輸入的第乙個字元給接收了,而顯示不出來。
14樓:匿名使用者
money、存期 year 和年利率 rate,根據下列公式計算存款到期時的利息 interest(稅前),輸出時保留2位小數。
interest = money(1+rate)^year - money
輸入輸出示例:括號內為說明
輸入1000 3 0.025 (money = 1000, year = 3, rate = 0.025)
輸出interest = 76.89
*/#include
#include
int main(void)
另外,虛機團上產品**,超級便宜
c語言程式設計注意點細節
15樓:匿名使用者
找一本認真的從頭看完,自己再多動手編點程式。有興趣的話可以去一些論壇上看看,能力足夠的話,可以做一些acm的題目。基礎打好後再看一些高階的書籍。細節方面主要是指標。
學習方法是一方面,心態可能是更重要的一面。只要想再學,總會學會的。
16樓:匿名使用者
這麼模糊的問題,你還是直接baidu,google會比較好。
如果你說的是c++,你可以看一些effective c++ ,essential c++之類的。
C語言問題,乙個C語言問題
錯誤是 d 了 因為陣列名s,代表字串陣列的首位址,s指向的位址就是s 0 的位址。gets s 正確則gets s 0 也是正確的,所以 a,c 正確。而scanf s s 1 實際上只是不從s 0 開始,而是從s 1 開始賦值而已,既然只輸給它5個字元,所以從s 1 開始賦值也不會過界,則b是正...
C語言問題,乙個C語言問題
include void main printf 它們的和為 d sum include int main if i 3 0 return 0 include main printf n printf sum d sum system pause include int main printf su...
問關於c語言指標的問題,問一個關於C語言指標的問題
常玉標 cannot convert from const int to double 編譯器 會出現這樣的錯誤.應為不能把const int 賦值給 double 型別的變數.希望你能懂 首先我鄙視下樓上的回答,答非所問。你這肯定錯誤的啊,首先 double p 是定義了一個指標變數p,p只能存放...