c语言中++i和i++有什么区别(c语言中+i和i+有什么区别)

1. c语言中+i和i+有什么区别

p=15因为它是先取i的值,然后i再自加1的,所以P是5+5+5=15,运算完之后i自加到8

一般会区别 i++与++i; i++是i先不自加,在语句完后自加,++i先自加

2. c语言中i++和i=i+1的区别

i++是后置运算符,i=i+1在同行的代码执行完后再执行;

++i是前置运算符,i+i+1在同行的代码执行前执行。

3. c语言中--i和i--有什么区别

c语言中''i=!a''的意思是将a取非的值赋值给i。!作为单目运算符的意思是取非,如!真=假,!假=真。C语言中一般情况下0表示假,非0表示真。另外值得注意的是=,==和!=的区别,=是赋值运算符,即把=右侧表达式的值赋值给左侧的变量;==是逻辑等于运算符,当两侧的表达式的值相等时返回真,否则返回假;!=是逻辑不等于运算符,当两则表达式的值不相等时返回真,否则返回假。扩展资料C语言运算符号的种类:

1、算术运算符:用于各类数值运算。包括加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)、自增(++)、自减(--)共七种。

2、关系运算符:用于比较运算。包括大于(>)、小于(=)、小于等于(>)六种。5、赋值运算符:用于赋值运算。分为简单赋值(=)、复合算术赋值(+=、-=、*=、/=、%=)和复合位运算赋值(&=、|=、^=、>>=、

4. c语言中i和i有什么区别

这两个的功能 是一样的。

使用过程中我认为要注意两个方面,第一个: += 是一个运算符,加号和等号中间不能有空格,输错了编译时会报错的。第二个:注意运算符优先级,比如这个 i += i * 2; 等价于 i = i + (i*2);

5. c语言中i是什么

c语言中i*是自增运算,而且是先加1后再执行。它的意义为将i带入运算与后面的变量或数值进行乘法运算。

第一次进入时i的初始值是0,k的初始值也是0。这时的i++并没有在本次语句中起到加一的作用,而是要在本次操作结束后再起作用,也就是在第一次循 环完全结束后。进入循环体本人看,k += i++;这时由于这里的是i++(需要先操作后加1),所以,k的值理所当然是0了,而在本句结束后i的值就进行了加1操作,在本次循环结束时又进行了一 次加1操作,所以本次循环结束后k=0,i=2;

第二次进入时i的初始值是2,k的初始值是0。同理分析,在k += i++;后k的值为2了,而i的值也由于两次i++变为了4。所以,本次循环结束后k=2,i=4;

第三次进入时i的初始值是4,k的初始值是2。同理分析,在k += i++;后k的值由于经过原来的值与i当前的值相加后变成了6,而i的值同样是在最后加了两个1。所以在本次循环结束后k=6,i=6;

第四次准备进入循环时,发现i的值已经比5大了。因此,程序终止。最后k的值为6,i的值也为6

6. 在c语言中++i和i++有什么区别

因为"++"是C语言定义的运算符,是被C语言编译器支持的,能被按照其规定逻辑编译的运算符。其语意就是一个变量自增,如果"++"在后则当前语句结果为自增前的值,从下条语句开始变量为自增后的值。如果"++"在后则当前语句的结果就是自增后的值。

比如,一个单行的“i++”可能就编译为:

而一行a=i++可能就编译为:

这些都是编译器根据++运算符的语意编译出来的,你非要问它为什么这样,那它就是这么定义的,编译器也就是按照这个规则编译它的。

就像老师说明天考试,你非要问老师“为什么明天要考试?”老师说“我就是要测验你们啊”,你还矫情问老师“为什么你就要明天测验我们?我能理解你明天让我们放假,但是你非让我们考试,我觉得你可能看我们不爽所以非要明天测验我们。而我猜测你也可能是失恋了,拿我们出气”…… 如果你觉得荒谬,那我告诉你,C语言编译器如果面对你题目中的问题,就像老师面对一个这样的学生一样。

重点补充:

感谢评论区李海怪同学指出的问题。说实话我当时写这个回答的时候是半夜一点多我刚忙完工作趟上床准备睡觉的时候。而且因为我刚回答完下面这个问题:

C语言执行a=a++;后a的值应该加一还是不变?

所以我当时一时觉得这些都是差不多的问题(其实也是有联系的,我下面说),就匆匆看了一下题目然后回答了一下这个问题睡觉了。因为关注的人不多,所以我也没怎么回看这个问题,直到李海怪同学提醒我题主想问的是"i++"为什么在运算结束后还能“返回”一个值?

不过针对如此,我上面其实没有说错(不过侧重点没往这上解释),这确实就是这么设计的,也确实是没有为什么“一定”要这么设计的原因:)

下面针对i++为什么会有“返回”我重新补充一下,以下是我的纯“个人观点”,没有准确的原作者依据:

其实不止i++这样的表达式有“返回值”,很多赋值语句(如a=b+1)都有“返回值”(注意这里返回值加了引号,因为它不是真正意义的返回值)关于C以及C衍生的语言为什么赋值表达式可以“返回”一个值,我已经找不到真实原因的考据了,如果谁找到当初设计原稿的作者原述请告诉我,感激不尽。我们现在也不能把丹尼斯里奇找出来问,但是将其归结为设计失误是莽撞的(有点太看不起一代大师级人物了)。这确实是C语言的设计,而不是单纯“失误”造成的,顶多你可以觉得它有好有弊,所以有人不赞同这样设计是绝对好的设计。

一个人,特别是一个(真)大师级别的人,很多设计都应该是有其思想支撑的(就像补码的设计,这里推荐

@三郎

写的这篇

三郎:计算机数学小书1-原码,反码和补码

c语言中++i和i++有什么区别(c语言中+i和i+有什么区别)

,可以看一下我们认为“自找麻烦”的补码是为什么那样设计)。那么丹尼斯里奇作为一代大师中的大师,他为什么要让很多赋值表达式有一个“返回值”呢?

我觉得丹尼斯先生可能是想体现“我可以不间断的使用我刚赋值的值”这种想法(个人猜测,没有证据)。比如我可以b = c = a + 1,我可以a=i++ , 我还可以while((*d++ = *s++) != 0),我也可以if ((len=strlen(str) + 1) > count),等等等等。我觉得他可能就是希望我可以这样来使用(当然并不是推荐优先这么写,C语言很多时候只是提供给我们方法,怎么用是编程者的责任。

说完为什么赋值表达式会有“返回值”的设计后,我们就说一下这个值是什么。

首先这不是一个真正意义上的“返回值”,一个赋值表达式并没有返回值。只是在将其和更多运算混用(或者说在一个表达式里需要引用其结果时)这个“返回值”才会被编译器预留。而预留的一般不是左值,而是右值(这里请不要把这条作为编程标准依据)。

比如

实际上是a + 1的结果被保存下来,赋值给c,又接着作为"返回值"给b=的表达式使用。如下面这段程序:

其未经过优化的纯存结果是(省去部分不重要内容):

可以看到a=33;b=c=a+1;两条语句就是下面这几行:

可以看出,编译器是先用eax存储的了a+1的值,然后将eax的值给c,又将c在内存中的值给eax寄存器,再将eax的值给b。这整个过程eax都充当了“返回值”。

如果还不够,我可以激进一点,写成:

编译结果为:

这样更能看出eax寄存器充当了(c=a+1)的“返回值”,而且这个“返回值”来源是a+1。

所以说这个“返回值”就是C语言对这种行为的支持。它就是想做到这种连贯的对于赋值的使用。它是赋值表达式的右面的结果被存储在一个地方后下面继续被使用的现象。而像i++这样的表达式更是其特殊运算符下的特殊“赋值”表达,很难用一行赋值表达式表达出来,但是编译器确是可以理解其正确意思,即在需要“返回值”时先保存i的值,然后让i的值加1覆盖i原来的值,则“返回”保存的原值。不需要“返回值”(单行i++)时则不必要预先保留原值。设计就是这样的,编译器也都是按照这样的逻辑解释的。

那么我开始提到的a=22;a=a++;的问题,为什么有的地方结果是22,有的地方结果是23呢。就是表达式的“返回值”和a++后a的值是两个不同位置。我原文中提到了,a=22;a=a++的编译结果“有时”是:

我们可以看出其实eax是保存的a++要“返回”的结果,然后编译器转而用edx去继续计算a+1后的结果。然后a++是一个带赋值语句,a=...也是一个赋值语句。那么“这里”就是在完成计算部分后,先完成a++的最后赋值,再完成a=(a++的返回值)的赋值。当然这种逻辑是没有得到保证的,具体还是回看我回答a=a++那个问题的描述。

那么回看题主的问题:

i++为啥会有值

答:i++是不是有“返回”值取决于你是否在一个表达式中“引用”(i++)的结果。单纯的一行i++,编译器是不会预留“返回值”的。只有在需要(i++)的结果时,C语言支持持续连贯的赋值表达式结果使用,即让编译器另外临时保存计算结果(其别于表达式左值的保存位置),给后续使用。

另外我提议问题是不是可以改的更明确一点,比如(抛砖引玉):C语言的赋值表达式,如i++, (i=i+1),为什么会有“返回”值?

以上纯属个人理解,如有雷同纯属巧合。如果有不同,也很正常:-)

更多与专业有关内容,请参考:

醉卧沙场:README - 专业性文章及回答总索引

7. c语言i+ 和i

c语言中i++和++i的区别主要在于自增的顺序,i++代表着i参与运算之后,i的值会自增1,通俗来讲也就是“先加1后赋值”,而++i则表示i自增1之后再参与其他运算,通俗说的“先赋值再加1”。

需要注意的是,若是在for循环里是有不同的,如果要表示递增,理论上两种都可以,不过一般情况下,循环变量增值用i++,而不用++i是因为在循环结构里需要循环变量来结束循环,而使用i++则会导致本来应该继续的循环少执行一次,所以循环结构里通常都是循环变量在一次循环结构执行完成之后再自增。

资料拓展:for循环是编程语言中一种开界的循环语句,而循环语句由循环体及循环的终止条件两部分组成,for循环其在各种编程语言中的实现与表达有所出入,但基本为以C语言和pascal语言代表的两种形式。

8. c语言i++和++i的区别举例

前置的++,是变量先自增1,然后再作其他操作, 后置的++,是先取变量当前的值操作,然后再自增1 你的例子中,i的初始值是1,执行k = ++i;时,先执行了 i = i + 1,也就是i的值变为2,再把i的值赋给k,所以k的值是2,i的值也是2 执行z = i ++;时,先取i的值赋给z,此时i的值是2,所以z也是2,然后再执行i= i + 1,这条语句执行完成后,i的值变为3

c语言中++i和i++有什么区别(c语言中+i和i+有什么区别)

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注