我有這三個代碼,它們確實有效,但它們沒有列印出我期望它們列印的內容。我認為我沒有正確理解這里的數學/優先級,并且想知道是否有人可以幫助我理解。
代碼 A
int a;
int b = 1;
for (a = 1; a < b 4; b , a = b * 2)
printf("%i\n", a);
我預計它會列印出 4、5。但它是 3、9。我明白這是正確的——但為什么呢?
代碼 B。
int a = 5;
int b = 0;
while (a > 3)
{
b = a;
--a;
}
printf("%i, %i\n", a, b);
誠然,我很難弄清楚數學。它列印出 3, 9 --- 但我不明白為什么。
代碼 C。
int a;
int b;
for (a = 7, b = 2; b < a; a )
b = a - 2;
printf("%d, %d\n", b, a);
這列印出 13、9,但我得到了 11、7。
uj5u.com熱心網友回復:
讓我們逐步完成第一個回圈:
for (a = 1; a < b 4; b , a = b * 2)
printf("%i\n", a);
首先,我們執行初始化陳述句,它給了我們
a=1和b=1(b在代碼前面設定)。我們執行測驗運算式 (
a < b 4, 即1 < 1 4),這是真的,所以我們繼續我們執行回圈體。我們還沒有執行任何操作
a,所以a仍然等于1所以我們的輸出是:1現在執行更新運算式,
b , a = b * 2. 這增加b(給我們b=2),然后設定a = b * 2,所以a = 4。我們執行測驗運算式,然后
4 < 2 4繼續。我們執行回圈體,它給我們作為輸出:
4我們執行更新運算式。我們增加
b,給我們b=3,然后設定a = b * 2,給我們a = 6。我們執行測驗運算式,然后
6 < 3 4繼續。我們執行回圈體,將我們作為輸出:
6我們執行更新運算式。我們增加
b,給我們b=4,然后設定a = b * 2,給我們a = 8。我們執行測驗運算式。
8 < 4 4是假的,所以我們退出回圈。
您可以對其他回圈進行類似的程序。
uj5u.com熱心網友回復:
可能造成混淆的部分原因是,如果沒有環繞的對{ ... }來描述幾行代碼,c 中的 for 回圈將一直執行到源代碼中找到第一個分號為止。對于代碼 A,for 回圈中第二個分號之后的內容在每次迭代時執行,并且陳述句printf也在每次迭代時執行。在最后一個代碼片段中,代碼 C。printf僅在 for 回圈的所有迭代完成后才執行。代碼片段 B 中的 while 回圈也是如此,在終止printf后執行。whilewhile 回圈使用{...}分隔字符使讀者更清楚這一點,而 for 回圈則不然。
當然,您仍然需要自己完成計算——這也相當棘手。
uj5u.com熱心網友回復:
回圈由for以下結構組成:
for ( init; condition; increment ) {
statement(s);
}
至于這實際上是如何執行的,它完全等價于以下內容:
init;
while(condition) {
statement(s);
increment;
}
因此,如果我們有以下代碼(代碼 A):
int a;
int b = 1;
for (a = 1; a < b 4; b , a = b * 2)
printf("%i\n", a);
這意味著:
init: a = 1
condition: a < b 4
increment: b , a = b * 2
statement(s): printf("%i\n", a);
while我們可以通過替換將其轉換為回圈:
int a;
int b=1;
a = 1;
while(a < b 4) {
printf("%i\n", a);
b , a = b * 2;
}
現在,我們可以一步一步地跟蹤執行,看看發生了什么。
第一個回圈:
1. b=1
2. a=1
3. a < b 4
1 < 1 4
1 < 5
true
4. Output: 1
5. b
b = b 1
= 1 1
= 2
6. a = b*2
= 2*2
= 4
第二個回圈:
1. a < b 4
4 < 2 4
4 < 6
true
2. Output: 4
3. b
b = b 1
= 2 1
= 3
4. a = b*2
= 3*2
= 6
第三個回圈:
1. a < b 4
6 < 3 4
6 < 7
true
2. Output: 6
3. b
b = b 1
= 3 1
= 4
4. a = b*2
= 4*2
= 8
第四個回圈:
1. a < b 4
8 < 4 4
8 < 8
false
2. End
uj5u.com熱心網友回復:
查看代碼 A:
int a;
int b = 1;
for (a = 1; a < b 4; b , a = b * 2)
printf("%i\n", a);
b設定為1;a設定為1;a(1) 小于b 4(5),所以回圈執行printf(), 列印1;b遞增到2;a設定為4(b * 2);a(4) 小于b 4(6),所以回圈執行printf(), 列印4;b遞增到3;a設定為6(b * 2);a(6) 小于b 4(7),所以回圈執行printf(), 列印6;b遞增到4;a設定為8(b * 2);a(8) 不小于b 4(8too),因此回圈終止。
您可以將類似的技術應用于其他情況。
查看代碼 B:
int a = 5;
int b = 0;
while (a > 3)
{
b = a;
--a;
}
printf("%i, %i\n", a, b);
a設定為5;b設定為0;a(5) 大于3所以回圈體執行;b(0)添加了a(5) ,所以它變成了5;a遞減,所以變成4;a(4) 大于3所以回圈體執行;b(5)添加了a(4) ,所以它變成了9;a遞減,所以變成3;a(3) 不大于3所以回圈終止;- 然后
printf()列印陳述句,a所以b結果是3, 9。
查看代碼 C:
int a;
int b;
for (a = 7, b = 2; b < a; a )
b = a - 2;
printf("%d, %d\n", b, a);
a設定為7;b設定為2;b(2) 小于a(7),因此回圈執行賦值運算子;a - 2是5這樣b設定為7(2 5);a遞增到8;b(7) 小于a(8),因此回圈執行賦值運算子;a - 2是6, 所以b設定為13(7 6);a遞增到9;b(13) 不小于a(9),因此回圈終止;- 然后
printf()列印陳述句,b所以a結果是13, 9。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/427873.html
標籤:C
上一篇:WASM&C:找不到功能
下一篇:如何列印C中陣列中的所有資料?
