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 ++中它没有用?
答案 0 :(得分:1)
cout << x = 20;
不是初始化。初始化是将初始值赋给变量,因此在您的情况下,它是在第一个字符串中完成的:int x = 10;
。 运算符优先级基本上是运算符shuold的执行顺序。在数学中,*
和/
发生在+
和-
之前。
operator<<
在C ++中的优先级高于operator=
,因此它将首先执行,然后才会执行operator=
。
答案 1 :(得分:0)
因为运营商的优先权不同。
“运算符的优先级是我们有时认为理所当然的事情,特别是如果我们对普通算术运算符的标准优先级规则非常熟悉和熟悉。但是太过于抱怨会让我们处于危险之中,特别是在像C ++这样的语言,它有各种各样的运算符,我们应该保持警惕。
作为一个简短的例子,从表中注意到输入/输出运算符(&gt;&gt;和&lt;&lt;)具有比关系运算符更高的优先级,但优先级低于算术运算符。这意味着像“
”这样的陈述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相同的输出。
答案 2 :(得分:0)
它 工作
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << (x = 20);
}
答案 3 :(得分:0)
我很惊讶它为你编译因为std::cout << x = 20
;与( std::cout << x ) = 20
相同,std::cout << x
的结果不是左值。如果你想要这样的初始化,无论如何都是个坏主意,你可以做std::cout << ( x = 20 )
。不过请不要这样做。这使得阅读源变得困难,并且无论如何都不会提高性能。这种简单的优化现在由编译器完成。