0

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++ 中它不起作用?

4

4 回答 4

1
  • 这:cout << x = 20;不是初始化。初始化是将初始值分配给变量,因此在您的情况下,它是在第一个字符串中完成的:int x = 10;.
  • 您在 PhP 中有 2 行,而不是 1 行。
  • C++ 中发生的事情是由于运算符优先级而发生的。

运算符优先级基本上是运算符应该执行的顺序。就像在数学中 where *and/发生在+and之前一样-

operator<<在 C++ 中具有比 更高的优先级operator=,因此它将首先执行,然后operator=才会发生。

运算符优先级表

于 2012-08-28T10:05:00.083 回答
0

因为运算符的优先级不同。

“运算符的优先级有时我们认为是理所当然的,特别是如果我们完全熟悉并熟悉常见算术运算符的标准优先级规则。但是过于顺从可能会使我们处于危险之中,尤其是在像 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 相同的输出。

于 2012-08-28T10:04:17.053 回答
0

确实有效

#include<iostream> 
using namespace std;  

int main(){
      int x = 10;
      cout << (x = 20);
} 
于 2012-08-28T10:57:26.830 回答
0

我很惊讶它为你编译,因为std::cout << x = 20; 与 相同( std::cout << x ) = 20,且 的结果std::cout << x不是左值。但是,如果您希望进行这种初始化,无论如何这都是一个坏主意,您可以执行std::cout << ( x = 20 ). 但是请不要这样做。它使阅读源代码变得困难,并且无论如何它都不会提高性能。这种简单的优化现在由编译器完成。

于 2012-08-29T19:47:00.083 回答