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;
- 你有两行PhP,而不是一行
- C++中发生的事情是因为运算符的优先级
运算符优先级基本上取决于运算符的执行顺序。这就像在数学中,*
和/
发生在+
和-
之前。
C++中的operator<<
的优先级高于operator=
,因此它将首先执行,然后才发生operator=
。
操作员优先级表
它是否工作
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << (x = 20);
}
因为运算符的优先级不同。
"运算符的优先级有时是我们认为理所当然的,特别是如果我们完全熟悉并熟悉常见算术运算符的标准优先级规则。但过于顺从可能会使我们处于某种危险之中,尤其是在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相同的输出。
我很惊讶它为您编译,因为std::cout << x = 20
;与( std::cout << x ) = 20
相同并且std::cout << x
的结果不是左值。然而,如果您希望进行这样的初始化,这无论如何都是个坏主意,那么您可以执行std::cout << ( x = 20 )
。但是请不要这样做。这使得读取源代码变得困难,而且无论如何也不会提高性能。这样简单的优化现在由编译器完成。