下面的代码演示了这种差异:
#include <iostream> #include <string> int main() { char s[] = "ABCD"; std::string str(s); char *p = s; while(*p) { *p++ = tolower(*p); // <-- incr after assignment } std::cout << s << std::endl; std::string::iterator it = str.begin(),end = str.end(); while(it != end) { *it++ = tolower(*it); // <-- incr before assignment ? } std::cout << str << std::endl; return 0; }
它产生输出:
abcd bcd
如果我们分配赋值操作和增量运算符:
while(it != end) { *it = tolower(*it); // <-- incr before assignment ? it++; }
输出将如预期.
原始代码有什么问题?
$g++ --version g++ (GCC) 3.4.4 (cygming special,gdc 0.12,using dmd 0.125) Copyright (C) 2004 Free Software Foundation,Inc.
解决方法
问题是operator =的参数的评估顺序是未指定的.这符合C标准5.2.2 / 8.考虑以下:
*it++ = tolower(*it);
等于
operator=( *it++,tolower(*it) );
现在*它可以在tolower(* it)之前计算,反之亦然.