问:最近在看orderofevaluationviolations,其中一个例子让我很困惑。1)如果标量对象上的副作用相对于此标量对象上的另一个副作用是无序的,则为未定义行为。//代码片段f(i=-1,i=-1);//undefinedbehavior未定义行为在这段代码中,很明显i是一个标量对象。算术类型(3.9.1)、枚举类型、指针类型、指针成员类型(3.9.2)、空指针类型、被const或volatile修饰的类型(3.9.3)统称为标量类型。从这句话看不出和上面的代码有什么区别。我认为无论第一个参数还是第二个参数先执行,i最终都是-1,两个参数的值都是-1。有人能解释清楚吗?***答:既然是乱序操作,不能说分配任务的指令不能交错。也许你会选择最好的运行方式,这是由CPU的架构决定的。为了说明,引用以下句子:如果A在B之前是无序的,并且B在A之前是无序的,那么有两种可能性:在一个线程的执行期间交错包含A和B的CPU指令)。估计A和B是不确定的顺序:它们可以按任何顺序运行但不能重叠。要么A在B执行之前完成,要么B在A执行之前完成。下次执行相同的语句时,执行顺序可能会颠倒过来。假设在执行操作后,-1被存储在内存地址中,这种行为本身似乎不会造成任何问题。但是如果一条指令与另一条操作同一内存地址的指令交织在一起,你不能说编译器不会将那些指令优化成一组单独的具有相同效果的指令,它就会出错。例如,假设将内存归零然后递减是有效的。现在起始值为-1,那么就是:1f(i=-1,i=-1)可能会变成:cleari//clearicleari//clearidecri//decreaseidecri//decreaseinow我是-2。这可能是一个虚假的例子,但它可能是真的。原文链接:stackoverflow翻译:伯乐在线-腰部浮华的企鹅翻译链接:http://blog.jobbole.com/62650/
