注册 登录
编程论坛 C++教室

[求助]C++临时变量,指针问题

冰烨 发布于 2008-10-13 08:44, 2073 次点击
int i=5;
    const int *n=&(i-1);
    cout<<*n;
为什么是错的呢?
而像int i = 5;
  int a = i - 1;
之类的语句又是怎么执行的呢?中间产生临时变量么?

对于
int i = 5;
  int a = i - 1;
之类的语句又是怎么执行的呢?中间产生临时变量么?
看中学者的解释就对了
而第一个问题应该解释如下:
首先i-1是一个表达值,它会产生一个临时变量,而任何变量都是有生命期的。这里()便是它的生命周期,出了()它就无效了,所以无法用&取址。

[[it] 本帖最后由 冰烨 于 2008-10-13 09:39 编辑 [/it]]
12 回复
#2
中学者2008-10-13 09:19
int i=5;
    const int *n=&(i-1);
这个错得很离谱...内建类型的赋值通常会涉及两个转换,第一个必须的转换是左值转右值.第二个可能的转换就是类型转换..
第一步进行类型匹配,第二步进行左-->右..
这里,很显然,根据这个步骤,类型匹配通过(可以转换的);第二步,括号优先级高,先执行括号内的,执行结果是个右值,而右值是没有地址的.你取地址.编译器就发现错误了.. 

对于这个.int i = 5;
  int a = i - 1;
类型匹配通过,i-1的结果是右值,直接赋给a...
#3
冰烨2008-10-13 09:27
thanks..右值是没有地址的。。
#4
kakaqq2008-10-13 09:28
&这个运算符操作的对象值只能是个变量。
#5
冰烨2008-10-13 09:40
[bo][un]中学者[/un] 在 2008-10-13 09:19 的发言:[/bo]

int i=5;
    const int *n=&(i-1);
这个错得很离谱...内建类型的赋值通常会涉及两个转换,第一个必须的转换是左值转右值.第二个可能的转换就是类型转换..
第一步进行类型匹配,第二步进行左-->右..
这里,很显然 ...

这样解释会不会更好呢?
首先i-1是一个表达值,它会产生一个临时变量,而任何变量都是有生命期的。这里()便是它的生命周期,出了()它就无效了,所以无法用&取址。
#6
song42008-10-13 15:50
[bo][un]kakaqq[/un] 在 2008-10-13 09:28 的发言:[/bo]

&这个运算符操作的对象值只能是个变量。

  这是主要
对于出了作用域  不是问题
那个临时变量在语句结束才消失  这貌似是基本
#7
song42008-10-13 16:03
而右值是没有地址的
他有地址 要不怎么存储
你可以看看变量的定义  这个'临时变量'没有名字 而&只对变量才有作用
如果我没记错的话
#8
wfx_best2008-10-13 20:27
我补充一下吧:
    首先取地址赋给指针,一般取的是内存里的地址,然而 i-1 这是表达式产生的结果是暂时放进
寄存器中的,(它在被用完后就在寄存器里消失了)也就说这个结果不在内存里,此时对它取地址根本谈不上。
还有个问题,表达式有生命周期吗?对一个表达式谈生命周期可能没有什么意义。
    如果有说错的地方,还望高手指正。
#9
larden2008-10-14 03:26
楼主理解太有想像力了,生命周期也太比喻了吧
和楼上有一样的困惑
#10
冰烨2008-10-15 09:15
[bo][un]larden[/un] 在 2008-10-14 03:26 的发言:[/bo]

楼主理解太有想像力了,生命周期也太比喻了吧
和楼上有一样的困惑

。。。我没说表达式有生命周期吧,说的是由表达式产生的结果。。。

高手继续,我越来越迷糊了
#11
song42008-10-15 09:22
理解 这个程度就可以了
再往下就是汇编了
寄存器也有名字 也可以寻址
#12
kakaqq2008-10-15 12:35
[bo][un]wfx_best[/un] 在 2008-10-13 20:27 的发言:[/bo]

我补充一下吧:
    首先取地址赋给指针,一般取的是内存里的地址,然而 i-1 这是表达式产生的结果是暂时放进
寄存器中的,(它在被用完后就在寄存器里消失了)也就说这个结果不在内存里,此时对它取地址根本谈不上 ...

这位理解很好。变量和表达式大概就这区别吧。
#13
永夜的极光2008-10-15 16:17
9#说的对,中间变量就是在寄存器里面的
寄存器可以寻址,但是只能直接寻址,用指针是不行的

看看以下代码就知道了,最后显示的b=6
#include<stdio.h>
#include <stdlib.h>
int main()
{
  int i = 1;
  int a = i + 5;
  int b;
  _asm
  {
    mov b,eax
  }
  printf("%d", b);
  return 0;
}

[[it] 本帖最后由 永夜的极光 于 2008-10-15 16:27 编辑 [/it]]
1