像这样组合声明和赋值是很常见的:
int beans = a * 2;
Run Code Online (Sandbox Code Playgroud)
或分开,像这样
int beans;
beans = a * 2;
Run Code Online (Sandbox Code Playgroud)
我目前的理解是bean可以被赋值,因为它是左值;它具有可写入的存储空间。右值a * 2无法分配给它,因为它只是一个带有值的表达式,没有存储空间。因此,这是允许的:
int beans;
(beans) = a * 2;
Run Code Online (Sandbox Code Playgroud)
事实上,任何作为左值的左操作数都应该有效。现在,这似乎表明int beans;是一个表达式,也是一个左值。但是,这是不允许的:
(int beans) = a * 2;
Run Code Online (Sandbox Code Playgroud)
就 C 解析器的设计方式而言,这表明声明不仅仅是带有左值的表达式。这里发生了什么?
c parsing initialization assignment-operator language-lawyer