我在一些C代码中遇到了=+,而不是标准的+=;我不太清楚这是怎么回事。我在文档中也找不到它。
=+
+=
cfh9epnr1#
在古代版本的C语言中,=+等同于+=,它的遗迹与最早的恐龙骨骼一起被发现。例如,B引入了广义赋值运算符,用x+=y将y加到x上。该符号来自Algol 68,通过McIlroy,McIlroy将其合并到他的TMG版本中。(在B和早期C中,运算符拼写为=+而不是+=;这个错误在1976年得到了纠正,它是由B的词法分析器中处理第一种形式的一种诱人的简单方法引起的。)[The C语言的开发,Dennis里奇。版权所有ACM,1993。内部引用省略。]从20世纪70年代中期开始,它就没有什么特殊的含义--它只是一个=,后面跟着一个+。
x+=y
y
x
=
+
w1jd8yoj2#
您可以在1979年1月出版的第7版UNIX手册(第2a卷)中找到旧符号的证据,该手册可在线访问http://cm.bell-labs.com/7thEdMan/(大约从2015年7月起不可用; 2015年6月的版本现在可以通过WayBack机器在http://cm.bell-labs.com/7thEdMan/-或在https://9p.io/7thEdMan/获得)。这一章的标题是Dennis M.里奇编写的“C Reference Manual”,它是手册的PDF版本,而不是HTML版本。在相关部分,它说:7.14.1左值=表达式表达式的值替换左值所引用的对象的值。操作数不必具有相同的类型,但两者必须都是int、char、float、double或pointer。如果两个操作数都不是指针,则按预期进行赋值,之前可能会转换右侧的表达式。如果两个操作数都是int或任何类型的指针,则不会进行任何转换。表达式的值被简单地存储到左值所引用的对象中。2这样就有可能生成指针,而这些指针在使用时会导致寻址异常。7.14.2左值=+表达式7.14.3左值=-表达式7.14.4左值=* 表达式7.14.5左值=/表达式7.14.6左值=%表达式7.14.7左值=〉〉表达式7.14.8左值=7.14.9左值=&表达式7.14.10左值=^表达式7.14.11左值=|表达方式形式为“E1 =op E2”的表达式的行为可以通过将其视为等价于“E1 = E1 op E2”来推断;此外,禁止像“i =+ p”这样的表达式,其中指针被加到整数上。另外,在“UNIX® SYSTEM:Readings and Applications,Volume II ',最初由AT&T作为其技术期刊于1984年10月出版,后来由Prentice-Hall于1987年出版(ISBN 0-13-939845-7)。其中一节为:
不可避免的是,一些改变改变了现有有效程序的语义。那些维护内部使用的各种编译器的人试图确保程序员有足够的警告,这些改变将生效,并且新编译器版本的引入不会强制所有程序立即重新编译。例如,在最早的实现中,不明确的表达式x=-1被解释为“将x减1”。现在它被解释为“将值-1赋给x”。这一变化发生在三个年度主要版本中。首先,编译器和lint程序验证器被更改为生成一条消息,警告存在“老式”赋值操作(如=-)。然后,将解析器更改为新的语义,编译器对不明确的赋值操作发出警告。最后,消除了警告消息。支持使用“老式初始化”
x=-1
lint
=-
int x 1;
这有助于解析器产生更智能的语法错误诊断。可以预见的是,一些C用户忽略了这些警告,直到引入不兼容的编译器,迫使他们在改变过时的源代码和维护自己版本的编译器之间做出选择。但总的来说,分阶段改变的策略是成功的。另外,在布莱恩·W·克尼汉和丹尼斯·M里奇(1978)的附录A第212页第17节“时代错误”中,它说:早期版本的C使用 * =op * 形式而不是 * op= * 形式的赋值运算符。这会导致多义性,典型表现为:
=op
op=
因为X1 M6 N1 X和X1 M7 N1 X是相邻的,所以其实际上递减X1 M5 N1 X,但其可容易地意味着将X1 M8 N1 X指派给X1 M9 N1 X。
uemypmqf3#
只是赋值后跟一元加号。
#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
a = +5
n6lpvg4x4#
它是+=的一个过时的变体,在现代编译器中,它相当于一个赋值运算符后面跟着一元+。
jtjikinw5#
我觉得
a =+ 5;
应等同于
a = (+5);
因此被编码为非常糟糕样式。我尝试了下面的代码,它打印“5”:
#include <iostream> using namespace std; int main() { int a=2; a =+ 5; cout << a; }
yuvru6vn6#
阅读了你的问题后,我只是调查了这些。让我告诉你我发现了什么。在gcc和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
5lwkijsr7#
使用“=+”,您只是指定操作数为正数,例如int a = +10;与负数int相同,a = -10;
7条答案
按热度按时间cfh9epnr1#
在古代版本的C语言中,
=+
等同于+=
,它的遗迹与最早的恐龙骨骼一起被发现。例如,B引入了广义赋值运算符,用
x+=y
将y
加到x
上。该符号来自Algol 68,通过McIlroy,McIlroy将其合并到他的TMG版本中。(在B和早期C中,运算符拼写为=+
而不是+=
;这个错误在1976年得到了纠正,它是由B的词法分析器中处理第一种形式的一种诱人的简单方法引起的。)[The C语言的开发,Dennis里奇。版权所有ACM,1993。内部引用省略。]
从20世纪70年代中期开始,它就没有什么特殊的含义--它只是一个
=
,后面跟着一个+
。w1jd8yoj2#
您可以在1979年1月出版的第7版UNIX手册(第2a卷)中找到旧符号的证据,该手册可在线访问http://cm.bell-labs.com/7thEdMan/(大约从2015年7月起不可用; 2015年6月的版本现在可以通过WayBack机器在http://cm.bell-labs.com/7thEdMan/-或在https://9p.io/7thEdMan/获得)。
这一章的标题是Dennis M.里奇编写的“C Reference Manual”,它是手册的PDF版本,而不是HTML版本。在相关部分,它说:
7.14.1左值=表达式
表达式的值替换左值所引用的对象的值。操作数不必具有相同的类型,但两者必须都是int、char、float、double或pointer。如果两个操作数都不是指针,则按预期进行赋值,之前可能会转换右侧的表达式。如果两个操作数都是int或任何类型的指针,则不会进行任何转换。表达式的值被简单地存储到左值所引用的对象中。2这样就有可能生成指针,而这些指针在使用时会导致寻址异常。
7.14.2左值=+表达式
7.14.3左值=-表达式
7.14.4左值=* 表达式
7.14.5左值=/表达式
7.14.6左值=%表达式
7.14.7左值=〉〉表达式
7.14.8左值=
7.14.9左值=&表达式
7.14.10左值=^表达式
7.14.11左值=|表达方式
形式为“E1 =op E2”的表达式的行为可以通过将其视为等价于“E1 = E1 op E2”来推断;此外,禁止像“i =+ p”这样的表达式,其中指针被加到整数上。
另外,在“UNIX® SYSTEM:Readings and Applications,Volume II ',最初由AT&T作为其技术期刊于1984年10月出版,后来由Prentice-Hall于1987年出版(ISBN 0-13-939845-7)。其中一节为:
*III.管理不相容的变更 *
不可避免的是,一些改变改变了现有有效程序的语义。那些维护内部使用的各种编译器的人试图确保程序员有足够的警告,这些改变将生效,并且新编译器版本的引入不会强制所有程序立即重新编译。
例如,在最早的实现中,不明确的表达式
x=-1
被解释为“将x减1”。现在它被解释为“将值-1赋给x”。这一变化发生在三个年度主要版本中。首先,编译器和lint
程序验证器被更改为生成一条消息,警告存在“老式”赋值操作(如=-
)。然后,将解析器更改为新的语义,编译器对不明确的赋值操作发出警告。最后,消除了警告消息。支持使用“老式初始化”
这有助于解析器产生更智能的语法错误诊断。
可以预见的是,一些C用户忽略了这些警告,直到引入不兼容的编译器,迫使他们在改变过时的源代码和维护自己版本的编译器之间做出选择。但总的来说,分阶段改变的策略是成功的。
另外,在布莱恩·W·克尼汉和丹尼斯·M里奇(1978)的附录A第212页第17节“时代错误”中,它说:
早期版本的C使用 *
=op
* 形式而不是 *op=
* 形式的赋值运算符。这会导致多义性,典型表现为:因为X1 M6 N1 X和X1 M7 N1 X是相邻的,所以其实际上递减X1 M5 N1 X,但其可容易地意味着将X1 M8 N1 X指派给X1 M9 N1 X。
uemypmqf3#
只是赋值后跟一元加号。
打印“5”。将
a =+ 5
更改为a =- 5
,它将打印“-5”。读取a =+ 5
的更简单的方法可能是a = +5
。n6lpvg4x4#
它是
+=
的一个过时的变体,在现代编译器中,它相当于一个赋值运算符后面跟着一元+
。jtjikinw5#
我觉得
应等同于
因此被编码为非常糟糕样式。
我尝试了下面的代码,它打印“5”:
yuvru6vn6#
阅读了你的问题后,我只是调查了这些。让我告诉你我发现了什么。在gcc和turboc上试过了。没有在Visual Studio上确定,因为我还没有在我的pC上安装它
我不知道其他的答案,因为他们说这是一个古老的C语言版本,但现代编译器把它们当作一个要分配的值(这是积极的或消极的,仅此而已),下面的代码让我更确信这一点。
5lwkijsr7#
使用“=+”,您只是指定操作数为正数,例如int a = +10;与负数int相同,a = -10;