输入输出标准库(IO library)分别重载了位操作符>>和<<用于输入和输出.即使很多程序员从未直接使用过位操作符,但是相当多的程序都大量用到这些操作符在IO标准库中的重载版本.重载的操作符与该操作符的内置类型版本有相同的优先级和结合性.因此,即使程序员从不使用这些操作符的内置含义来实现移位操作,但是还是应该先了解这些操作符的优先级和结合性.
IO操作符为左结合
像其他二元操作符一样,移位操作符也是左结合的.这类操作符从左向右地结合,正好说明了程序员为什么可以把多个输入或输出操作连接为单个语句:
cout<<"hi"<<"there"<<endl;
执行为:
((cout<<"hi")<<"there")<<endl;
在这个语句中,操作数"hi"与第一个<<符号结合,其计算结果与第二个<<符号结合,第二个<<符号操作后,其结果再与第三个<<符号结合.
移位操作符具有中等优先级:其优先级比算术操作符低,但比关系操作符、赋值操作符和条件操作符优先级高.若IO表达式的操作数包含了比IO操作符优先级低的操作符,相关的优先级别将影响书写该表达式的方法.通常需使用圆括号强制先实现右结合:
cout<<42+10; //ok,+ has higher precedence,so the sum is printed
cout<<(10<42); //ok:parentheses force intended grouping:prints 1
cout<<10<42; //error:attempt to compare cout to 42!
第三个cout语句解释为:
(cout<<10)<42;
该表达式说"将10写到cout,然后用此操作(也就是cout)的结果与42作比较.