用C++看這個規律1/2 2/3 3/5 5/8 8/13一直寫到第20個的值?

#include &

void main()

{

int a,b,i;

a=1;

b=2;

for(i=1;i&<=20;i++)

{

b=a,a=a+b;

printf("%d/%d ",b,a);

}

}

上面是我寫的,為什麼答案是這樣的


你可能以為:

b=a,a=a+b;

會先求值兩個賦值的右側,然後在分號處再進行這兩個賦值工作。

但是,C++ 的逗號運算符[1]並不是這樣工作的,只會首先求值逗號左側表達式(b=a),再求值右側表達式(a=a+b),然後返回右方表達式的值(a),這裡沒用到該返回值。

所以,修正的方法是,先在循環里列印 a/b,然後備分b到一個臨時變數,才更新b,最後用備份的值更新a

[1] 其他運算符 - cppreference.com §內建的逗號運算符


題外話,Lua 可用多重賦值,做到把右側先求值,再一次賦值:

local a, b = 1, 2
for i = 1, 20 do
print(a .. "/" .. b)
a, b = b, a + b
end


b=a,a=a+b;等效於

b=a;//b複製a

a+=b;//a變成2倍,也就是說 a=2*b了,所以是2,4,8,16,32......了

改成

fenzi = a;

fenmu = a+b;

b = fenzi;

a = fenmu;


#include &

int main( void )
{
for( unsigned i=0,a=1,b=1; i!=20; ++i )
{
b = b+a;
a = b-a;
printf( "%u/%u ", a, b );
}
}


斐波那契數列了解一下

你這數列就是

n geq 2, frac{fib_n}{fib_{n + 1}}


如果單看分子或分母難道不是斐波那契數列?


推薦閱讀:

現在C++開發是不是都遵守C++11標準,Linux下的多線程編程是優先考慮C++11的線程庫,還是用系統線程API封裝?
如何評價Qt Lite Project?
什麼時候用指針形參?什麼時候用引用形參?
G++和Clang對於這個模板別名的處理哪個正確?

TAG:C | C編程 | C語言函數 |