PHP
<?php
$x = 10;
echo $x = 20;
?>
c ++
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << x = 20;
return 0;
}
なぜphp初期化で1行の出力が機能するのに、C ++では機能しなかったのですか?
cout << x = 20;
ではありません。初期化は変数に初期値を割り当てることなので、あなたの場合、それは最初の文字列で行われます:int x = 10;
。演算子の優先順位は、基本的に、演算子が実行される順序です。それは数学のように、前と前*
に/
起こります。+
-
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の場合と同じ出力が得られます。
それがあなたのためにコンパイルされていることに驚いていますstd::cout << x = 20
。は と同じ( std::cout << x ) = 20
で、 の結果はstd::cout << x
左の値ではありません。必要に応じて、とにかく悪い考えであるそのような初期化を行うことができますstd::cout << ( x = 20 )
。ただし、しないでください。ソースを読むのが難しくなり、とにかくパフォーマンスが向上しません。このような単純な最適化は現在、コンパイラによって行われています。
それは機能します
#include<iostream>
using namespace std;
int main(){
int x = 10;
cout << (x = 20);
}