# std::valarray<T>::operator+=,-=,*=,/=,%=,&=,|=,<<=,>>=

< cpp‎ | numeric‎ | valarray

valarray<T> operator+=( const valarray<T>& v ); valarray<T> operator-=( const valarray<T>& v ); valarray<T> operator*=( const valarray<T>& v ); valarray<T> operator/=( const valarray<T>& v ); valarray<T> operator%=( const valarray<T>& v ); valarray<T> operator&=( const valarray<T>& v ); valarray<T> operator|=( const valarray<T>& v ); valarray<T> operator^=( const valarray<T>& v ); valarray<T> operator<<=( const valarray<T>& v ); valarray<T> operator>>=( const valarray<T>& v ); | (1) |
valarray<T> operator+=( const T& val ); valarray<T> operator-=( const T& val ); valarray<T> operator*=( const T& val ); valarray<T> operator/=( const T& val ); valarray<T> operator%=( const T& val ); valarray<T> operator&=( const T& val ); valarray<T> operator|=( const T& val ); valarray<T> operator^=( const T& val ); valarray<T> operator<<=( const T& val ); valarray<T> operator>>=( const T& val ); | (2) |

应用复合赋值运算符到数值数组中的每个元素。

1) 将以应用对应运算符到每个元素先前值和来自 `v` 的对应元素所获得的值，赋值给每个元素。
若 size() != v.size() 则行为未定义。
若任何 `v` 中的值在赋值过程中计算并依赖任何 *this 中的值，即赋值右侧的表达式引用到赋值左侧的变量，则行为未定义。
2) 将以应用对应运算符到每个元素先前值和 `val` 的值所获得的值，赋值给每个元素。

### 参数

v | - | 另一个数值数组
val | - | 一个值

### 返回值

*this

### 异常

可能抛出实现定义的异常。

### 注解

仅若满足下列条件，才能实例化各个运算符：

- 所指示的运算符可应用于类型 `T`
- 返回值可以无歧义地转换为 `T` 。

### 示例

    #include <iostream>
    #include <string_view>
    #include <type_traits>
    #include <valarray>

    void o(std::string_view rem, auto const& v, bool nl = false) {
        if constexpr (std::is_scalar_v<std::decay_t<decltype(v)>>) {
            std::cout << rem << " : " << v;
        } else {
            for (std::cout << rem << " : { "; auto const e : v)
                std::cout << e << ' ';
            std::cout << "}";
        }
        std::cout << (nl ? "\n" : ";  ");
    }

    int main()
    {
        std::valarray<int> x, y;

        o("x", x = {1, 2, 3, 4}), o("y", y = {4, 3, 2, 1}), o("x += y", x += y, 1);
        o("x", x = {4, 3, 2, 1}), o("y", y = {3, 2, 1, 0}), o("x -= y", x -= y, 1);
        o("x", x = {1, 2, 3, 4}), o("y", y = {5, 4, 3, 2}), o("x *= y", x *= y, 1);
        o("x", x = {1, 3, 4, 7}), o("y", y = {1, 1, 3, 5}), o("x &= y", x &= y, 1);
        o("x", x = {0, 1, 2, 4}), o("y", y = {4, 3, 2, 1}), o("x <<=y", x <<=y, 1);

        o("x", x = {1, 2, 3, 4}), o("x += 5", x += 5, 1);
        o("x", x = {1, 2, 3, 4}), o("x *= 2", x *= 2, 1);
        o("x", x = {8, 6, 4, 2}), o("x /= 2", x /= 2, 1);
        o("x", x = {8, 4, 2, 1}), o("x >>=1", x >>=1, 1);
    }

输出：

    x : { 1 2 3 4 };  y : { 4 3 2 1 };  x += y : { 5 5 5 5 }
    x : { 4 3 2 1 };  y : { 3 2 1 0 };  x -= y : { 1 1 1 1 }
    x : { 1 2 3 4 };  y : { 5 4 3 2 };  x *= y : { 5 8 9 8 }
    x : { 1 3 4 7 };  y : { 1 1 3 5 };  x &= y : { 1 1 0 5 }
    x : { 0 1 2 4 };  y : { 4 3 2 1 };  x <<=y : { 0 8 8 8 }
    x : { 1 2 3 4 };  x += 5 : { 6 7 8 9 }
    x : { 1 2 3 4 };  x *= 2 : { 2 4 6 8 }
    x : { 8 6 4 2 };  x /= 2 : { 4 3 2 1 }
    x : { 8 4 2 1 };  x >>=1 : { 4 2 1 0 }