C中=是什么意思?

我在一些C代码中遇到了=+而不是今天的标准+= ; 我不太确定这里发生了什么事。 我也无法在文档中find它。

在C的古代版本中, =+相当于+= 。 在最早的恐龙骨头旁边发现了它的遗迹。 还有,它没有什么特别的含义 – 它只是一个=后面的。

您可以在http://cm.bell-labs.com/7thEdMan/在线获得1979年1月的第七版UNIX手册(卷2a)中的旧符号证据。;

本章标题为Dennis M. Ritchie的“ C参考手册 ”,并且在手册的PDF版本中,但不在HTML版本中。 在相关部分,它说:

7.14.1 lvalue =expression式

expression式的值将replace左值引用的对象的值。 操作数不必具有相同的types,但都必须是int,char,float,double或pointer。 如果两个操作数都不是指针,则按照预期进行赋值,可能在右边的expression式转换之前进行赋值。 当两个操作数都是int或任何types的指针时,都不会发生转换; expression式的值简单地存储在由左值引用的对象中。 因此可能会产生指针,这些指针在使用时会导致寻址exception。

7.14.2 lvalue = +expression式
7.14.3 lvalue = – expression式
7.14.4 lvalue = *expression式
7.14.5左值= /expression式
7.14.6 lvalue =%expression式
7.14.7 lvalue = >>expression式
7.14.8 lvalue = <<expression式
7.14.9 lvalue =&expression式
7.14.10 lvalue = ^expression式
7.14.11 lvalue = | expression

可以通过将其等同于“E1 = E1 op E2”来推断“E1 = op E2”forms的expression式的行为; 然而,E1只被评估一次。 而且,像''i = + p''这样的expression式被添加到一个整数,被禁止。


另外,L Rosler在“UNIX®SYSTEM:Readings and Applications,Volume II”最初由AT&T公司于1984年10月出版的技术杂志(Prentice-Hall,1987)中发表了一篇论文“ C进化 ” ISBN 0-13-939845-7)。 其中一部分是:

III。 pipe理不兼容的更改

不可避免地,所做的一些改变改变了现有有效程序的语义。 那些维护内部使用的各种编译器的人试图确保程序员有足够的警告,说这样的改变将会生效,并且引入一个新的编译器版本并不会立即强制重新编译所有的程序。

例如,在最早的实现中,模糊expression式x=-1被解释为“x减1”。 现在解释为“赋值-1到x”。 这个变化发生在三个年度主要版本的过程中。 首先,更改编译器和lint程序validation程序,以生成一条警告信息,警告存在“老式”分配操作,例如=- 。 接下来,将parsing器更改为新的语义,编译器警告不明确的赋值操作。 最后,警告信息被消除了。

支持使用“老式初始化”

 int x 1; 

(没有等号)被类似的策略抛弃了。 这有助于parsing器产生更多的智能语法错误诊断。

可以预见的是,一些C用户忽略了这些警告,直到引入不兼容的编译器,迫使他们select更改过时的源代码或者假定维护自己版本的编译器。 但整体而言,阶段性变革的策略是成功的。

这只是分配,然后是一元加。

 #include <stdio.h> int main() { int a; a =+ 5; printf("%d\n",a); return 0; } 

打印“5”。 将a =+ 5更改为a =- 5 ,并打印“-5”。 读取a =+ 5的更简单的方法可能是a = +5

这是一个古老的“+ =”不存在的变体。 在现代编译器中,这相当于一个赋值运算符,后跟一个一元“+”。

我认为

 a =+ 5; 

应该相当于

 a = (+5); 

因此是非常不好的风格的代码。

我试了下面的代码,它打印“5”:

 #include <iostream> using namespace std; int main() { int a=2; a =+ 5; cout << a; } 

看完你的问题后,我只是调查了这些。 让我告诉你我发现了什么。 尝试了海湾合作委员会和turboc。 没有确定在Visual Studio,因为我没有安装在我的PC上

  int main() { int a=6; a =+ 2; printf("%d",a); } o/p , a value is 2 int main() { int a=6; a =- 2; printf("%d",a); } o/p , a value is -2 

我不知道其他答案,因为他们说它是一个古老的C版本。但是现代编译器把它们看作是一个值得分配的东西(正面的或负面的),下面的代码使我更加确信它。

  int main() { int a=6; a =* 2; \\ Reporting an error inavlid type of argument of unary * printf("%d",a); } if *= is equal to =* then it should not report error but its throwing an error