急:c语言中的比如j++和++j在程序中怎么区分和应用 请教高手,谢谢! C语言中i++和j++=分别是什么意思

C\u8bed\u8a00J++\u548c++J\u53c8\u4ec0\u4e48\u533a\u522b\uff1f

\u5f53\u5355\u72ec\u4e00\u4e2a\u8bed\u53e5\u7684\u65f6\u5019\u6ca1\u6709\u533a\u522b\uff0c\u5982\u679c\u7528\u5728\u8868\u8fbe\u5f0f\u4e2d\uff1a
J++\u662f\u5148\u53d6J\u7684\u503c\u505a\u8ba1\u7b97\uff0c\u518d\u81ea\u52a0\uff1b
++J\u662f\u5148\u81ea\u52a0\uff0c\u518d\u53d6J\u7684\u503c\u505a\u8ba1\u7b97\u3002

\u6bd4\u5982
int J = 2, K;
\u5982\u679c
K = J++;
\u90a3\u4e48\u5148\u53d6J\u7684\u503c\u8d4b\u503c\u7ed9K\uff0c\u4e8e\u662fK\u503c\u4e3a2\uff0cJ\u503c\u518d\u81ea\u52a0\uff0cJ=3\u3002

\u5982\u679c
K = ++J;
\u90a3\u4e48J\u5148\u81ea\u52a0\uff0c\u5f97\u5230J=3\uff0c\u7136\u540e\u518d\u53d6J\u503c\u8ba1\u7b97\uff0cK\u503c\u4e3a3.

i++\u7684\u610f\u601d\u662fi=1+1
\u548cj++\u610f\u601d\u4e00\u6837\uff0cj++\u5c31\u662fj=j+1

\u6269\u5145\uff1a++i\uff0c\u4e5f\u662fi=i+1,

i++\u662f\u5148\u6267\u884c\uff0c\u540e\u8ba1\u7b97
++i\u662f\u5148\u8ba1\u7b97\uff0c\u540e\u6267\u884c

\u6bd4\u5982
int i;
i=0;
\u6253\u5370i++
\u6253\u5370i++
\u8fd9\u65f6\u5019\u6253\u5370\u51fa\u6765\u76842\u4e2a\u7ed3\u679c\u662f0\u548c1\uff0c\u6b64\u65f6i\u5df2\u7ecf\u7b49\u4e8e2\u4e86

int i;
i=0;
\u6253\u5370++i
\u6253\u5370++i
\u8fd9\u65f6\u5019\u6253\u5370\u51fa\u6765\u76842\u4e2a\u7ed3\u679c\u662f1\u548c2\uff0c\u6b64\u65f6i\u7b49\u4e8e2

j++是j自增,不参与表达式的计算。
而++j则是将j先自增后再参与表达式计算。
如表达式(++j)+j
如开开始j=3,那么先自增1,j=4,并且后面的j也按4算
表达式的值为8

给你看个详细的别人的解释:
1.对++j的处理分两种情况,一种是在表达式进行运算之前就将++j计算,然后再进行表达式运算;第二种是在表达式运算的过程当中进行++j自增并计算表达式的值。
2.两种情况对j++的处理方式一样,都是表达式运算完成后自增,所以j++对表达式的运算无影响。

第一种情况:
就TC来说,他是第一种,先把++j进行自增,然后再进行加法运算,而不管++j出现的顺序,比如:

m+=(j++)+(++j)+(j++);

有一个++j,所以先将j自增一次,假设j = 2,自增一次后为3,最后的运算就是:

m += 3 + 3 + 3;

而不是
m += 2 + 3 + 4, 虽然结果都是m += 9
你试着把他们的顺序换一下:
m+=(j++)+(j++)+(++j);
++j换到了后面,结果仍然是3+3+3,而不是2+2+3,

再如:
m+=(j++)+(++j)+(j++)+(++j);
++j出现了2次,那么先将j自增两次,为4,表达等价于:
m+= 4 + 4 + 4 + 4;
而不是
m+=2+3+2+3;

看下这个表达式的汇编:
1 inc si ;自增j
2 inc si
3 mov ax,si ;加法运算
4 add ax,si
5 add ax,si
6 add ax,si
7 add di,ax
8 inc si ;自增j
9 inc si

第1行和第2行是将++j自增,3到7行是加法运算。8、9行是j++的自增,不参与表达式的运算。

所以使用这种编译方式的编译器,++j的位置对结果无影响。

第二种情况:
VC、dev c,好像gcc也是这种情况,他是在运算过程中对++j进行运算。所以++j的位置对结果有影响。

其中VC的还比较奇特,比如
m=(j++)+(++j)+(++j)+(j++)+(j++);
的汇编:
mov eax, DWORD PTR _j$[ebp]
add eax, 1
mov DWORD PTR _j$[ebp], eax ++j;
mov ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov edx, DWORD PTR _j$[ebp]
add edx, 1
mov DWORD PTR _j$[ebp], edx ++j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
add ecx, DWORD PTR _j$[ebp] m += j;
mov DWORD PTR _m$[ebp], ecx

结果是
m = 3 + 3 + 4 + 4 + 4 = 18
但是将其中一个++j调换顺序:
m=(j++)+(++j)+(j++)+(++j)+(j++);
结果是:
m = 3 + 3 + 3 + 4 + 4 = 17

但是
m = (j++)+(j++)+(++j)+(++j)+(j++)+(j++);
结果却是
m = 2 + 2 + 3 + 4 + 4 + 4 = 19

就是说前面两个在第二个++j之前都提前进行了++j,而第三个表达式没有。

总之比较奇特,跟VC编译器代码优化什么的有关系。而且你将VC6的编译改成release,上面第三个表达式的结果就是
m = 4 + 4 + 4 + 4 + 4 + 4 = 24,不是19了!

++在前 先自加后运算
++在后 先运算后自加

例如:
int i=5, j=6;
int ret = 0;

ret = i++; // ret = 5; i=5;
ret = i; // ret =6; i=6;
ret = ++j; // ret = 7; j=7;
ret = j; //ret = 7; j=7;

优先级的问题,打个比方吧,j++就是先用j的数值,再给它加个一,++j,就是先加了一再应用它的值······

给你个记忆方法吧

++i;
++在前,记成i先自加,也就是先把i=i+1,再把i赋给其它变量

i++;
++在后,记成i后自加,也就是先把i赋给其它变量,再把i=i+1

  • 鎬:c璇█涓殑姣斿j++鍜++j鍦ㄧ▼搴忎腑鎬庝箞鍖哄垎鍜屽簲鐢 璇锋暀楂樻墜,璋㈣阿!_鐧...
    绛旓細绗1琛屽拰绗2琛屾槸灏++j鑷锛3鍒7琛屾槸鍔犳硶杩愮畻銆8銆9琛屾槸j++鐨勮嚜澧烇紝涓嶅弬涓庤〃杈惧紡鐨勮繍绠椼傛墍浠ヤ娇鐢ㄨ繖绉嶇紪璇戞柟寮忕殑缂栬瘧鍣紝++j鐨勪綅缃缁撴灉鏃犲奖鍝嶃傜浜岀鎯呭喌锛歏C銆乨ev c锛屽ソ鍍廹cc涔熸槸杩欑鎯呭喌锛屼粬鏄湪杩愮畻杩囩▼涓++j杩涜杩愮畻銆傛墍浠++j鐨勪綅缃缁撴灉鏈夊奖鍝嶃傚叾涓璙C鐨勮繕姣旇緝濂囩壒锛姣斿 m=(j++)...
  • c璇█j 鏄粈涔堟剰鎬
    绛旓細鍦C璇█涓锛j涓鑸寚鐨勬槸铏氶儴锛岀敤浜庤〃绀哄鏁颁腑铏氶儴鐨勫笺傚湪C璇█涓紝澶嶆暟鍙互琛ㄧず鎴愬疄閮ㄤ笌铏氶儴鐨勫舰寮忥紝鍏朵腑瀹為儴涓哄疄鏁帮紝铏氶儴鐢╥鎴杍鏉ヨ〃绀恒傚浜庢湁鍏冲鏁扮殑璁$畻锛屽湪C璇█涓紝鍙互浣跨敤澶嶆暟杩愮畻搴撹繘琛岃繍绠椼傚洜姝わ紝鍦–璇█涓紝j涓昏鐢ㄤ簬琛ㄧず澶嶆暟涓殑铏氶儴鍊笺傚湪C璇█涓紝瑕佽〃绀轰竴涓櫄鏁帮紝闇瑕佸湪瀹炴暟鍚庨潰娣诲姞...
  • c璇█缂栫▼涓轰粈涔堝父甯哥敤i鍜宩浣滀负寰幆鍙橀噺
    绛旓細鍦C璇█缂栫▼涓紝i鍜宩甯稿父琚敤浣滃惊鐜彉閲忥紝涓昏鏄洜涓哄畠浠畝鐭佹槗浜庤緭鍏ワ紝骞朵笖宸茬粡鎴愪负浜嗙紪绋嬬晫鐨勪竴绉嶅箍娉涙帴鍙楃殑绾﹀畾銆1. 绠鐭笌鏄撲簬杈撳叆锛氬湪缂栫▼涓紝鎴戜滑闇瑕佷笉鏂湴閿叆浠g爜銆備娇鐢ㄧ畝鐭殑鍙橀噺鍚嶏紝濡俰鍜宩锛屽彲浠ュぇ澶у噺灏戝嚮閿鏁帮紝浠庤屾彁楂樼紪绋嬫晥鐜囥傜壒鍒槸鍦ㄦ棭鏈熺殑璁$畻鏈虹紪绋嬩腑锛屽綋绋嬪簭鍛橀渶瑕佹墜鍐欎唬鐮佹椂锛...
  • c璇█涓殑 j++涓绫荤殑鎰忔濇槸鍚庨潰鏈夌敤鍒癹杩欎釜瀹氫箟鍊煎湪渚垮湪j杩欎釜鍊间笂鍔1...
    绛旓細j=j+1;涔熷氨鏄锛屽湪鍚玧++鐨勮〃杈惧紡閲搴旂敤鐨勬槸j鍘熸潵鐨勫硷紝璁$畻瀹屾瘯鍚庡啀灏唈鍔1銆傚啀涓嬩竴琛屼娇鐢ㄧ殑灏辨槸鍔1鍚庣殑j鍊间簡銆
  • C璇█涓璲--鍜宩涔嬪悗鏄竴鏉$洿绾挎湁浠涔堝尯鍒拰鑱旂郴
    绛旓細j--,鏄c璇█涓鐨勪竴绉嶈繍绠楋紝琛ㄧず鍏堝紩鐢ㄥ悗鑷噺 j_锛岀殑璇濆彲浠ユ槸涓涓彉閲忥紝涓嶆槸浠涔堣繍绠椼傚鏋滄槸j-=a鐨勮瘽灏辨槸杩愮畻浜嗭紝鐩稿綋浜巎=j-a;
  • c璇█绋嬪簭;j--鍜--j鏈変粈涔堝尯鍒?
    绛旓細鍗曠嫭浣跨敤娌℃湁鍖哄埆锛屼絾濡傛灉鍦ㄨ〃杈惧紡涓嚭鐜版湁鍖哄埆銆俲-- 鍑虹幇鍦ㄨ〃杈惧紡涓椂锛宩 浼氫互褰撳墠鍊煎弬涓庤〃杈惧紡杩愮畻涓紝鏈鍚庢墠鑷噺1.--j 鍑虹幇鍦ㄨ〃杈惧紡涓椂锛宩 浼氬厛鑷噺1锛岀劧鍚庝互鍑1鍚庣殑鍊煎弬涓庡埌琛ㄨ揪寮忚繍绠椾腑銆++ 涔熷姝ゃ渚嬪锛歫 = 3;i = --j; // i 鐨勫间负 2, j 涓2 // i = j--; // i ...
  • C璇█ 鍐掓场娉涓殑鍙橀噺i鍜宩鍒板簳琛ㄧず浠涔
    绛旓細鍦ㄤ綘鍙戠殑杩欎釜绋嬪簭涓紝j琛ㄧず闇瑕佹瘮杈冪殑鈥滆稛鏁扳濓紙浠庣涓涓厓绱犳瘮杈冨埌鏈鍚庝竴涓厓绱犵О涓轰竴瓒燂級銆俰鍒欑敤浜庢帶鍒舵瘡涓瓒熺殑姣旇緝娆℃暟锛屽苟閫氳繃i姣旇緝鐩搁偦涓や釜鏁帮紙鍒嗗埆鏄痑[i]鍜宎[i+1]锛夌殑澶у皬锛屽苟杩涜閫傚綋鐨勪氦鎹傜敱浜庢瘡涓瓒熸瘮杈冪粨鏉熷悗锛屾渶澶х殑鏁板瓧涓瀹氬凡缁忓埌杈炬渶鍚庣殑浣嶇疆锛屾墍浠ユ帴涓嬫潵鐨勫悇瓒熸瘮杈冧腑渚夸笉闇瑕佸啀...
  • C璇█ 缁撴瀯鍙橀噺 A,c,j鍒嗗埆鏄粈涔堟剰鎬,绛旀缁欑殑鏄疉
    绛旓細A鏄敤typedef struct璇彞瀹氫箟鐨勪竴涓粨鏋勭被鍨嬶紝c鏄疉缁撴瀯绫诲瀷鐨勪竴涓彉閲忥紝j鏄竴涓暣鍨嬪彉閲忥紝int鏄绠楁満閲屾湁鐨勭被鍨嬶紝A鏄綘鏂板畾涔夌殑涓涓被鍨嬪畠鍙笉杩囨槸鍜宨nt ,float,绛変竴鏍风殑涓涓姪璁扮锛岀敤A鍙互瀹氫箟浠绘剰鐨勫彉閲忥紝杩欎簺鍙橀噺閲岄潰閮藉寘鎷嚜宸辩殑{int b,p;}銆傝繖灏辨槸闈㈠悜瀵硅薄鐨勭紪绋璇█鐨鍘熷褰㈡丄鏄竴涓被...
  • c璇█if(j>=i)浠涔堟剰涔??
    绛旓細if鏄C璇█鍒嗘敮璇彞鍏抽敭瀛楋紝()涓殑琛ㄨ揪寮忔槸鍒嗘敮鏉′欢锛屾潯浠舵弧瓒虫椂灏辨墽琛()鍚庨潰鐨勭敱{}鎷捣鏉ョ殑澶嶅悎璇彞鎴栦竴鏉¤鍙(鍙湁涓鏉¤鍙ユ椂鎵嶆槸杩欑鎯呭喌)銆傛墍浠ラ闈腑鐨刬f(j>=i)鐨勬剰鎬濆氨鏄鏋渏姣攊澶ф垨涓巌鐩哥瓑鏃跺氨鎵ц()鍚庨潰鐨勪綋璇彞锛屽惁鍒欒烦杩囧畠鍚庨潰鐨勪綋璇彞銆姣斿锛//#include "stdafx.h"//If the vc...
  • C璇█J++鍜++J鍙堜粈涔堝尯鍒?
    绛旓細褰撳崟鐙竴涓鍙ョ殑鏃跺欐病鏈夊尯鍒紝濡傛灉鐢ㄥ湪琛ㄨ揪寮忎腑锛欽++鏄厛鍙朖鐨勫煎仛璁$畻锛屽啀鑷姞锛++J鏄厛鑷姞锛屽啀鍙朖鐨勫煎仛璁$畻銆姣斿 int J = 2, K;濡傛灉 K = J++;閭d箞鍏堝彇J鐨勫艰祴鍊肩粰K锛屼簬鏄疜鍊间负2锛孞鍊煎啀鑷姞锛孞=3銆傚鏋 K = ++J;閭d箞J鍏堣嚜鍔狅紝寰楀埌J=3锛岀劧鍚庡啀鍙朖鍊艰绠楋紝K鍊间负3....
  • 扩展阅读:看图写话扫一扫图 ... c语言和c++先学哪个好 ... 托班语言急了急了上厕所 ... 免费搜题拍照 ... c#为什么用的人很少 ... c语言j++和++j的区别 ... 大一c++编程期末考试 ... 前置++和后置++ ... c语言x++和++x的区别 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网