PHP
<?php
$x = 10;
echo $x = 20;
?>
C++
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << x = 20;
return 0;
}
为什么在 php 中初始化然后在一行中输出,在 c++ 中它不起作用?
cout << x = 20;
不是初始化。初始化是将初始值分配给变量,因此在您的情况下,它是在第一个字符串中完成的:int x = 10;
.运算符优先级基本上是运算符应该执行的顺序。就像在数学中 where *
and/
发生在+
and之前一样-
。
operator<<
在 C++ 中具有比 更高的优先级operator=
,因此它将首先执行,然后operator=
才会发生。
因为运算符的优先级不同。
“运算符的优先级有时我们认为是理所当然的,特别是如果我们完全熟悉并熟悉常见算术运算符的标准优先级规则。但是过于顺从可能会使我们处于危险之中,尤其是在像 C++ 这样的语言中,运营商种类繁多,值得警惕。
作为一个简短的示例,请注意表中输入/输出运算符(>> 和 <<)的优先级高于关系运算符,但低于算术运算符的优先级。这意味着像“
http://cs.stmarys.ca/~porter/csc/ref/cpp_operators.html
您的 c++ 代码根本无法编译并抛出:
a.cpp: In function 'int main()':
a.cpp:6:17: error: no match for 'operator=' in 'std::cout.std::basic_ostream<_CharT, _Traits>::operator<< [with _CharT = char, _Traits = std::char_traits<char>](x) = 20'
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/iosfwd:86:11: note: candidate is: std::basic_ostream<char>& std::basic_ostream<char>::operator=(const std::basic_ostream<char>&)
您必须将代码括在括号中才能编译。当你这样做时,你将得到与 php 相同的输出。
它确实有效
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << (x = 20);
}
我很惊讶它为你编译,因为std::cout << x = 20
; 与 相同( std::cout << x ) = 20
,且 的结果std::cout << x
不是左值。但是,如果您希望进行这种初始化,无论如何这都是一个坏主意,您可以执行std::cout << ( x = 20 )
. 但是请不要这样做。它使阅读源代码变得困难,并且无论如何它都不会提高性能。这种简单的优化现在由编译器完成。