牛客網回顧錯題,有一道題很有意思,值得研究一下:
下面的程式將來列印什麼?()
public class testincr
}
再看一道題,也是來自牛客網:
public class q3
}
是不是感覺很**,我剛開始看到的時候也覺得很扯淡,誰會這麼寫**?我剛開始還以為編譯不通過。但是,上面兩段**確實是可以通過編譯,而且可以正確計算出結果。接下來我們先確定一下i++以及++i這兩個具體的執行流程:
i++:先自增,再返回原來的值
int temp = i;
i = i + 1;
return i;
++i:直接+1返回
i = i + 1;
return i;
因此下面這段**的列印值是:1 0 2 0
int i = 0;
int j = 0;
int m = 0;
int k = 0;
j = i++;
m = ++i;
k = k++;
system.out.println(i);
system.out.println(j);
system.out.println(m);
system.out.println(k);
再看上面第一道牛客網的題:列印結果是1。
下面的程式將來列印什麼?()
public class testincr
}
有的同學可能有疑問,不應該結果為0 嗎?首先,我們要清楚乙個計算規則:多個表示式的加減法運算都是從左到右進行的,每組表示式根據加減乘除的優先順序判定。
比如:
int a = 1;
int b = a + 2*a++;
這就是三個表示式:a,a++,2*a++;計算順序從左到右;計算結果為:1+2*2 = 5;
再比如:
int b = 2;
int c = b++ + 3 * b++;
這也是三個表示式:b++, b++, 3 * b++;計算結果為:2 + 3 * 3 = 8;
因此i=i++ + i;並不是計算完i++就直接返回的,後面要加乙個i的值。這道題的計算流程為:
i = i++ + i;
i++ ===> int temp = i; i=i+1;return i; i++這個表示式的結果為0,i的值為1;
i++ + i ===> 0 + 1 =1;結果為1;
再看第二道題:列印結果為 2,2,1,16;
public class q3
}分析:
k = i++ + i++;
第乙個i++ ==> int temp = i; i=i+1; return temp;此時結果為0;i為1;
第二個i++ ==> int temp = i; i=i+1; return temp;此時結果為1;i為2;
二者相加:k = 0+1 =1
j = ++j + j++;
++j ==> j = j+1; return j; 此時結果為1,j為1;
j++ ==> int temp = j; j = j+1;return temp; 此時結果為1,j為2;
二者相加為1+1=2;j為2;
l = l++ + 15 + l++;
第乙個l++ ===> int temp = l; l = l+1;return temp; 此時結果為0;l為1;
15常量,不計算
第二個l++ ===> int temp = l; l = l+1; return temp; 此時結果為1; l為2;
三者相加為 0 + 15 + 1 =16.結果為16。
如果看到這裡你還是感覺有些不理解的話,可以參考這篇講關於i++以及++i原理的部落格:
如果對你有幫助,請點贊
關於i 和 i以及左值,右值
今天無意之間看到了帖子上有人說 i 5 不合法 i 5 合法首先對於i 的實現是 int temp temp i i i 1 return temp 而 i的實現是 i i 1 return i 所以對於我們提出來的問題已經能得到解決了 再囉嗦幾句關於i 和 i的效率問題 按上面分析來說,i的效率是...
對i 與 i的分析
標籤 c語言 i i by 小威威 1 單獨使用 i 與 i單獨作為乙個語句使用時,即 i i 二者是等價的,並沒有什麼爭議,相當於語句 i 1 2 賦值使用 首先,i 與 i有什麼本質區別呢?i 指先取出i,再進行i 1操作 i指先進行i 1,再取出i。i 與 i賦值使用時,即 a i a i 此...
關於i 與 i 的問題
不要再問 i i啦!好多人面試的喜歡問 i 和 i的區別。尤其是對應屆畢業生面試中尤為常見。更有主考官原意出 x 4 x 4 x x 這種難題,覺得這種題可以綜合考察被面試者的綜合能力。不排除有人,能把這種題答的很完美,但也不排除有的主考官連自己都搞不明白。先不說這題出的對錯,這種問題,在大部分 覺...