C中的运算符优先级对于指针和迭代器是否不同?

下面的代码演示了这种差异:
#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)之前计算,反之亦然.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...