C++ 在哪里可以找到++运算符的实现?
在哪里可以找到数字和指针的++运算符的C/C++实现C++ 在哪里可以找到++运算符的实现?,c++,c,algorithm,C++,C,Algorithm,在哪里可以找到数字和指针的++运算符的C/C++实现 我浏览了一下网页,但没有找到太多…编译器的源代码中有实现 通常,编译器将执行以下操作: 推断i的类型。 如果i是纯整数类型或整数的引用,编译器将生成一个中间表示,表示从内存加载(如果需要)和一个简单的+1增量。 如果i是一个指针,编译器将生成一个中间表示,表示从内存加载(如果需要),然后是一个add指令,该指令将sizeof*i而不是+1相加。 如果i是一个重载运算符++在作用域中的类型,它将生成一个中间表示,指示对重载运算符定义的函数调用。
我浏览了一下网页,但没有找到太多…编译器的源代码中有实现 通常,编译器将执行以下操作: 推断i的类型。 如果i是纯整数类型或整数的引用,编译器将生成一个中间表示,表示从内存加载(如果需要)和一个简单的+1增量。 如果i是一个指针,编译器将生成一个中间表示,表示从内存加载(如果需要),然后是一个add指令,该指令将sizeof*i而不是+1相加。 如果i是一个重载运算符++在作用域中的类型,它将生成一个中间表示,指示对重载运算符定义的函数调用。
这里没有魔法。I++图通常是一个简单的AddioIndor或Inc指令,用于积分类型,并可能映射到C++中的函数调用。 < P>我想您想看到为这个操作生成的机器代码。在这里:
//sg
int main()
{
int i=0;
++i;
return 0;
}
使用:gcc-S-fverbose asm-masm=intel test.c编译
以下是与装配相关的部分:
mov DWORD PTR [ebp-4], 0 # i,
add DWORD PTR [ebp-4], 1 # i,
将此与
//sg
int main()
{
int i=0,j;
j=i+1;
return 0;
}
这将生成更长的asm:
mov DWORD PTR [ebp-4], 0 # i,
mov eax, DWORD PTR [ebp-4] # tmp62, i
add eax, 1 # tmp61,
mov DWORD PTR [ebp-8], eax # j, tmp61
还请注意,现代编译器会自动将i=i+1更改为较短的i++。可能是我对数字的回答,在某种程度上有帮助: 您可以驱动指针的答案 i++如何在低级别中工作。 您可以使用gcc g++中的-S标志对其进行反汇编: 我的代号是m.c 它将创建一个m.s部件文件 阅读我添加的评论:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $32, %esp
movl $1, 28(%esp) // i due to declarations
movl $0, 24(%esp) // j
movl 28(%esp), %eax // this two lines are j = i
movl %eax, 24(%esp)
addl $1, 28(%esp) // increment to i, i++
movl $.LC0, %eax
movl 28(%esp), %edx
movl %edx, 8(%esp)
movl 24(%esp), %edx
movl %edx, 4(%esp)
movl %eax, (%esp)
call printf
这是如何分配=先发生,然后++。如果++是后缀
编译器的工作原理:
根据我的编译器
表达式j=i++的抽象语法树的自底向上计算
源代码:
j = i++;
在较低的级别,分为两条指令,如您在汇编代码中看到的:
j=i
我++
其中i++是i=i+1
前缀++++i的情况:
还假设表达式为j=++i,则i直接编写抽象语法树:
它将首先递增++然后=执行
// abstract syntax tree for j = ++i
=
/ \
/ \
j \
+ (prefix)
/ \
/ \
i 1
j=++i的汇编代码,其中j=0和i=1最初:
movl $1, 28(%esp) // i declaration
movl $0, 24(%esp) // j
addl $1, 28(%esp) // First Add 1 to i because i++ (before = perform)
movl 28(%esp), %eax // Below two steps: = performed j = i
movl %eax, 24(%esp)
这是一个非常基本的问题,你最好从课本上了解一下 但无论如何 数字 内置的++将数值增加1,从而更改内存内容。您可以在整数和浮点对象上使用此运算符。您可以使用它作为前缀运算符,编写++x,也可以作为后缀运算符,编写x++ 区别在于前缀和后缀变量产生的表达式值。前缀++x递增x,并在C++中生成x的新值,因为我记得它用x值生成x的引用。后缀x++增加x并产生x的原始值 指针 前缀和后缀的区别是相同的,但是增加1的定义是不同的 对于指向T数组第i项的T*类型指针,在递增该指针后,它将指向数组的第i+1项 这意味着机器代码级地址增加了sizeofT
表达式p+n,其中n为整数,如果最终值定义良好,则产生与n增量相同的最终值。这也可以写成n+p。这个问题很难理解。你是指在C++中,你在哪里找到一个++操作符的实现?@厄瓦尔德:哦,在这种情况下,编译程序被编译成机器代码或字节码。通常是一个机器代码指令。@ ErWald:C和C++编译器不是解释器,它们是编译器。它们生成二进制输出0和1。该代码的解释留给机器中的电路或CPU中的微码等,由硬件解释。。。通常不存在执行整数/指针增量的实际代码,除非我们讨论的是某些32位系统上的long@Mehrdad,这是重要信息。否则你会如何在你的?@ GrijeshChauhan上实现一致的C++实现?谢谢!非常感谢!我以为++操作符是在某处实现的。。。谢谢@jogojapan你是说积分类型?inc不适用于double。@axiom,但可能会在某些方面有所帮助。至少我认为没有误导,先生。它增加了很多+1.我来自新德里BVCOE。@匿名否决票:请解释你的否决票,例如,你看不到它如何回答问题,这样你的意见在将来更容易被忽略。蒂亚。@JonathonReinhart:所以你对这个答案投了否决票,因为你的答案被否决了?你是个白痴吗?编辑:好的,我看了你的答案,我不能通过投票将其取消删除,因为它是错误的,使用了之前的单词。但我没有投反对票。你应该 真的不会因为有人打了你而打别人@干杯。-阿尔夫+1,为什么答案被否决,这是个好答案!
// abstract syntax tree
+ (post)
/ \
/ \
= 1
/ \
/ \
j i
// abstract syntax tree for j = ++i
=
/ \
/ \
j \
+ (prefix)
/ \
/ \
i 1
movl $1, 28(%esp) // i declaration
movl $0, 24(%esp) // j
addl $1, 28(%esp) // First Add 1 to i because i++ (before = perform)
movl 28(%esp), %eax // Below two steps: = performed j = i
movl %eax, 24(%esp)