Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在哪里可以找到++运算符的实现?_C++_C_Algorithm - Fatal编程技术网

C++ 在哪里可以找到++运算符的实现?

C++ 在哪里可以找到++运算符的实现?,c++,c,algorithm,C++,C,Algorithm,在哪里可以找到数字和指针的++运算符的C/C++实现 我浏览了一下网页,但没有找到太多…编译器的源代码中有实现 通常,编译器将执行以下操作: 推断i的类型。 如果i是纯整数类型或整数的引用,编译器将生成一个中间表示,表示从内存加载(如果需要)和一个简单的+1增量。 如果i是一个指针,编译器将生成一个中间表示,表示从内存加载(如果需要),然后是一个add指令,该指令将sizeof*i而不是+1相加。 如果i是一个重载运算符++在作用域中的类型,它将生成一个中间表示,指示对重载运算符定义的函数调用。

在哪里可以找到数字和指针的++运算符的C/C++实现


我浏览了一下网页,但没有找到太多…

编译器的源代码中有实现

通常,编译器将执行以下操作:

推断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)