#1 - 2022-5-25 20:43
aquarium (至少,还活着。)
while循环一般的运行结果,不是应该和按照循环次数复制代码的得出结果一样吗...
然后...
下面这几行里的那个while,理论上是循环了4次,可是当我删掉这个while,复制了3次循环里的代码接在后面再次运行,理应一模一样的结果,完全不一样(bgm38)
到底发生了什么...
#include<iostream>
using namespace std;
struct list
{
        int coe;
        int pow;
        struct list *next;
        list(){coe=0;pow=0;next=NULL;}
       
};
list create(){list o;return o;}
int main()
{
        list ini;
        list *A=&ini;
        list *tem=A;
        int i=1;
        while(i<21){
        tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
        tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
        tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
        tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
        tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;}
                       
        tem=A;
        for(int i=0;i<5;i++){cout<<tem->coe<<","<<tem->pow<<endl;tem=tem->next;}

        system("pause");
        return 0;
}
#2 - 2022-5-25 20:55
&create()
(bgm38)
#2-1 - 2022-5-25 21:18
aquarium
问题出在这里嘛......
#2-2 - 2022-5-25 21:28
[已注销]
aquarium 说: 问题出在这里嘛......
你是不是golang用户,一个想法不一定对
#2-3 - 2022-5-25 21:47
aquarium
大的药 说: 你是不是golang用户,一个想法不一定对
不是,只是个初学者......
#3 - 2022-5-25 21:06
(xD)
什么经典++谜语(bgm38)
#4 - 2022-5-25 21:18
这样用指针应该是会造成悬垂引用的。。
#4-1 - 2022-5-25 21:20
可乐呀
事实上我用 gcc v8.1.0 这个代码已经编译不了了
error: taking address of temporary [-fpermissive]
     tem->next = &create();
#5 - 2022-5-25 21:21
g++ -Wall b.cpp
b.cpp: In function ‘int main()’:
b.cpp:19:52: error: taking address of rvalue [-fpermissive]
   19 |         tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
      |                                              ~~~~~~^~
b.cpp:20:52: error: taking address of rvalue [-fpermissive]
   20 |         tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
      |                                              ~~~~~~^~
b.cpp:21:52: error: taking address of rvalue [-fpermissive]
   21 |         tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
      |                                              ~~~~~~^~
b.cpp:22:52: error: taking address of rvalue [-fpermissive]
   22 |         tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;
      |                                              ~~~~~~^~
b.cpp:23:52: error: taking address of rvalue [-fpermissive]
   23 |         tem->coe=i++;tem->pow=i+1;tem->next=&create();cout<<tem->coe;tem=tem->next;}
      |                                              ~~~~~~^~
#5-1 - 2022-5-25 21:24
🐦
如果编译的时候有任何形式的warning,请优先解决这些warning再提问,因为任何形式的warning在c++里面都可能是会发生不符合预期的结果的

在你的代码里面,list create()返回的是一个局部变量的拷贝,位置应该是在栈上,其生命在你对其取地址并赋值到变量里就已经结束了,在这之后的任何形式的使用其内容都不保证结果,后续的任何代码调用都可能会覆盖上面那个局部变量的拷贝所在的内存位置
#5-2 - 2022-5-25 21:49
aquarium
🐦 说: 如果编译的时候有任何形式的warning,请优先解决这些warning再提问,因为任何形式的warning在c++里面都可能是会发生不符合预期的结果的

在你的代码里面,list create()返回...
好的...,感谢你的解惑。
#6 - 2022-5-25 22:56
(。´-д-)
Why is it illegal to take the address of an rvalue temporary?
楼上的解释是不对的,返回值没有被释放..那个报错应该是跟隐式类型转换有关..但是你的代码应该没发生类型转换,我不懂为啥你能跑通而且最后结果还出错了