【发布时间】:2018-03-07 01:09:05
【问题描述】:
我最初有以下代码,其中it 是void**:
while (it != end)
{
*it = *(it + 1);
it++;
}
我决定将it + 1; it++; 更改为++it;,因为我计算了两次相同的值。
while (it != end)
{
*it = *(++it);
}
但是,在这样做之后,我的程序不再以相同的方式运行。
编辑:我要注意这不是i = i++;,而是将it指向的值赋给它前面的值。
【问题讨论】:
-
*it = *(++it);产生未定义的行为,任何事情都可能发生。 -
@HongOoi @Pablo 是吗?这与链接问题中提供的示例不同
i = i++。这是将it指向的值分配给它前面的值it + 1或++it。 -
@MichaelSmith 出于同样的原因,它是 UB。
++it修改变量it,同时尝试将表达式的结果分配给it。这就是为什么这是未定义的行为,您试图在一个表达式上修改同一个变量两次。赔率是*it = *(++it);与++it相同,但谁知道编译器是如何在幕后优化的。按照这个逻辑,第一个代码 sn-p 实际上修改了数组,第二个没有。
标签: c