i++和++i是什么意思
i++和++i是什么意思?
*
简单的理解就是i++是先访问i然后再自增,而i++则是先自增然后再访问i的值。
*
用下面的代码作为一个例子
*
#include
int main() {
int i,x;
i = 1;
x = 1;
x = i ++; //先让x变成i的值1,再让i加1
print("%d", x); //输出的x为1
print("%d", i); //输出的i为2
i = 1;
x = 1;
x = ++i; //先让i加1, 再让x变成i的值2
print("%d", x); //输出的x为2
print("%d", i); //输出的i为2
}
数组a[i++]是等于a[i]还是a[i+1]?
a[i++]等于a[i]
例如:
a[i]=10;i=1;则:
int y = a[i];
int x = a[i++]; // x=10;
// 此时i=2
----------------
i++是后加,也就是说表达式结束之后才自增。++i是先加,也就是说表达式运算之前就自增了。
i++是什么意思
一直以来,++ --语法浪费了太多人的时间。说句实在话,++ -- 在C语言中其实是一个很细节的语法,除了表达简练外,真的没有什么其它的好处了。
由于中国的C语言教程长期以来被谭浩强主宰,而谭又错误的把++ --作为一个C语言重点来教,并增加了一些难点,把本来很简单的语法,搞得复杂无比!
简单的来说,++i 和 i++,在单独使用时,就是 i=i+1。
而 a = ++i,相当于 i=i+1; a = i;
而 a = i++,相当于 a = i; i=i+1;
如果实在搞不明白++ --怎么回事,那也不是什么天塌下来的事。
因为a=++i完全可以写成 i++; a=i。
a=i++完全可以写成 a=i; i++。
而且,这也是一种好的程序风格:++ -- 语句如非特殊需要,请单独一行使用。
C语言 p=(i++)+(i++)+(i++); q=(++j)+(++j)+(++j);
这是不好的用法,属于Unspecified Behavior
operator+的两个参数参与运算时,对left operand和right operand的求值顺序,标准没有进行严格定义,所以最终结果取决于相关编译器实现,因而在不同环境下会出现不同的结果
至于你说的那个三个i相加后再自增三次这种说法,只是为了迎合这一结果而生硬的凑出来的解释,事实上这个表达式用clang编译器编译的结果就不是15
跑去又测试了一下,GCC环境下输出为15,22,8,8,VS环境下输出为15,24,8,8,已经印证了这一用法在不同环境下的不确定性,通过分析反汇编可以分析一下gcc和vs采用的不同策略
首先看GCC所生成的汇编
00401326movl $0x5,0x20(%esp)
0040132Emovl $0x5,0x24(%esp
这一部分是p=(i++)+(i++)+(i++);
00401336mov 0x20(%esp),%eax
0040133Aadd %eax,%eax
0040133Cadd 0x20(%esp),%eax
00401340mov %eax,0x28(%esp)
00401344incl 0x20(%esp)
00401348incl 0x20(%esp)
0040134Cincl 0x20(%esp)
可以看出确实是先相加三次再自增三次
这部分是q=(++j)+(++j)+(++j);
00401350incl 0x24(%esp)
00401354incl 0x24(%esp)
00401358mov 0x24(%esp),%eax
0040135Cadd %eax,%eax
0040135Eincl 0x24(%esp)
00401362add 0x24(%esp),%eax
可以看出其运算策略是先自增两次,进行一次累加,再自增一次,随后再累加一次
再来看VS生成的汇编
00FE13EE mov dword ptr [i],5
00FE13F5 mov dword ptr [j],5
p=(i++)+(i++)+(i++);
00FE13FC mov eax,dword ptr [i]
00FE13FF add eax,dword ptr [i]
00FE1402 add eax,dword ptr [i]
00FE1405 mov dword ptr [p],eax
00FE1408 mov ecx,dword ptr [i]
00FE140B add ecx,1
00FE140E mov dword ptr [i],ecx
00FE1411 mov edx,dword ptr [i]
00FE1414 add edx,1
00FE1417 mov dword ptr [i],edx
00FE141A mov eax,dword ptr [i]
00FE141D add eax,1
00FE1420 mov dword ptr [i],eax
这一部分运算策略和GCC一致
q=(++j)+(++j)+(++j);
00FE1423 mov eax,dword ptr [j]
00FE1426 add eax,1
00FE1429 mov dword ptr [j],eax
00FE142C mov ecx,dword ptr [j]
00FE142F add ecx,1
00FE1432 mov dword ptr [j],ecx
00FE1435 mov edx,dword ptr [j]
00FE1438 add edx,1
00FE143B mov dword ptr [j],edx
00FE143E mov eax,dword ptr [j]
00FE1441 add eax,dword ptr [j]
00FE1444 add eax,dword ptr [j]
00FE1447 mov dword ptr [q],eax
这一部分却是先自增三次,再进行两次累加,于是就产生了和GCC不相同的运算结果
通过汇编只是说明一下,这种用法在不同的编译环境下无法预知其结果,所以应该避免这种用法,也不要试图在未知环境中预测这种用法的行为
i++和++i的区别
*
a = ++i,相当于 i=i+1; a = i;
*
a = i++,相当于 a = i; i=i+1;
如果有表达式 a = i++ 它等价于 a = i ; i = i + 1;
如果有表达式 a = ++i 它等价于 i = i + 1; a = i;
1 首先两者的区别是:前者是先赋值,然后再自增;后者是先自增,后赋值
2 ++i和i++都是分两步完成的。因为++i 是后面一步才赋值的,所以它能够当作一个变量进行级联赋值,++i = a =b,即 ++i 是一个左值;i++ 的后面一步是自增,不是左值。
3 ++i 和i++ 的使用,一般来说在循环域里面,这两者并没有什么很大的区别,因为编译器一般都会给你做优化。但是要注意其生存周期,以及很难察觉的写脏,就好像指针delete以后一定要赋予0一样,我们要注意i值在程序流中的变化。
++i和i++有什么区别啊?
*
区别在于:++先做别的事,再自己加1,++i先自己加1,再做别的事情,形象的理解,你可以把++i比作自私的人,首先考虑自己的事,i++是无私的,先为别人照想,这样方便记忆。
*
首先我们定义一个变量i,int i=5,然后我们做执行printf(“%d”,i++),我们会发现输出结果是5。
*
是为什么呢,我们要搞清楚printf(“%d”,i++)这句话是做两件事:1.输出i、2.i=i+1,这里的顺序,是先输出i,再执行i=i+1。
*
然后我们初始化变量i,i=5;、然后我们做执行printf(“%d”,++i)、我们会发现输出结果是6,其实printf(“%d”,++i);做的也是这两件事:1.输出i、2.i=i+1,只是先做i=i+1,然后输出i。
i+=2是什么意思?
为c语言,java等中常见算式,即i=i+2。
但两者还是有一定区别。
i=i+2 比 i+=2多了一次对变量 i 的运算。后者效率高。
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
二十世纪八十年代,为了避免各开发厂商用的C语言语法产生差异,由美国国家标准局为C语言制定了一套完整的美国国家标准语法,称为ANSI
C,作为C语言最初的标准。目前2011年12月8日,国际标准化组织(ISO)和国际电工委员会(IEC)发布的C11标准是C语言的第三个官方标准,也是C语言的最新标准,该标准更好的支持了汉字函数名和汉字标识符,一定程度上实现了汉字编程。
++i,--i,i++,i-- ?
i=5,单看i++和++i都是6 i--和--i也都是4,
但是把这些放到运算式子中就不一样了,
(1)i++和i--是先运算后++或--,
(2)++i和--i是先++或--后运算,
也就是说(1)中++和--没有用,用i=5算式子
但(2)中就要用6或4算式子
matlab中这个矩阵S(i,:)是什么意思?
S(i,:)中的“i”表示矩阵S的第i行,“:”就表示这一行的所有列,因此S(i,:)就表示S阵的第i行的所有元素喽!
相应的S(:,i)就表示S阵的第i列喽!
*i++与 ++*i
*i++
是先*后++.这的++是针对i;
++*i
是先*在++.这的++是针对(*i).
*i++
因为i++是使用后++所以,要先*后,在++;
有个程序你可以运行验证。
#include
#include
using namespace std;
int main()
{
int num[3]={1,4,3};
int *i=num;
cout<<*i++<<endl;
// cout<<++*i<<endl;
return 0;
}
c++的程序。
楼主看你的补充了,你要清楚++是针对谁的。
main()
{
int a = 0,*i;
i = &a;
*i++;
printf("%d",a);
}
首先,*i取出来就是a就是0.然后++是针对i的,不是(*i)所以a没变。
main()
{
int a = 0,*i;
i = &a;
++*i;
printf("%d",a);
}
也是首先*i取出来就是a为0,然而++是针对(*i)的,所以a值+1了。就是1.
i++和++i是什么意思:等您坐沙发呢!