=+ 在 C 中是啥意思?
Posted
技术标签:
【中文标题】=+ 在 C 中是啥意思?【英文标题】:What does =+ mean in C?=+ 在 C 中是什么意思? 【发布时间】:2011-11-26 07:14:56 【问题描述】:我今天在一些 C 代码中遇到了=+
,而不是标准的+=
;我不太确定这里发生了什么。我在文档中也找不到。
【问题讨论】:
那段代码是否按预期工作?如果不是,那可能是一个错字。 @TimCooper 非常肯定,它有很多行并且代码编译得很好。我正在使用微软视觉工作室 @SteveRowe:VS(就像地球冷却后的任何编译器一样)将其视为 = (+)。 我就是不明白为什么这些有趣的问题——但从根本上说是微不足道的、纯粹的娱乐——问题总是会得到很多关注(和“竖起大拇指”),有几十个 相同的答案,而提出严肃问题的人通常会忽略其问题,并且答案为 0。回答琐碎的问题不需要任何努力。让我们回答困难的问题。 @gd1:这可能是 StackExchange 模型中最大的缺陷。此类问题不仅很受欢迎,而且通常与问题应该“基于您面临的实际问题”(faq)的指导方针相矛盾,使得该指导方针与社区对网站的实际使用不符可笑。简而言之,对最没用的问题给予最高分——这与投票的目的完全相反。我在元数据上提出了这个问题,但被击落了。 【参考方案1】:在 C 的 古 版本中,=+
等同于 +=
。它的残余物与最早的恐龙骨骼一起被发现。
例如,B 引入了广义赋值运算符,使用
x+=y
将y
添加到x
。该符号来自 Algol 68,通过 McIlroy 将其合并到他的 TMG 版本中。 (在 B 和早期 C 中,运算符被拼写为=+
而不是+=
;这个错误在 1976 年得到修复,是由在 B 的词法分析器中处理第一种形式的一种诱人的简单方法引起的。)
[C 语言的发展,丹尼斯·里奇。版权所有 ACM,1993。内部引用省略。]
自 1970 年代中期以来,它没有任何特殊含义——它只是一个 =
后跟一个 +
。
【讨论】:
但由于与一元+混淆,不再支持。 我可以确认=+
最初与当前的+=
相同。我不记得两者是否从一开始就有效,或者 =+
最初是唯一的选择,但无论如何,由于模棱两可,它(非常正确地)被放弃了。
这可能只是 VAX 的事情,但我发誓我被教导 += 是前置增量,而 =+ 是后置增量,我记得我们几乎总是完全相同的东西......但不是在复杂的操作顺序问题中。
@markgz:参见丹尼斯paper 的第 5 页(警告:后记)关于 C 的历史。
谢谢,杰瑞。对于那些感兴趣的人,论文中关于“=+”的内容如下:“......这个错误,在 1976 年修复......”。 1976 年比我早。【参考方案2】:
您可以在 1979 年 1 月的第 7 版 UNIX 手册(第 2a 卷)中找到旧符号的证据,可在线获取 http://cm.bell-labs.com/7thEdMan/(大约从 2015 年 7 月开始提供;2015 年 6 月的版本现在可以通过 WayBack Machine 获取,网址为http://cm.bell-labs.com/7thEdMan/ — 或 https://9p.io/7thEdMan/)。
该章节的标题为 Dennis M. Ritchie 的“C 参考手册”,在手册的 PDF 版本中,但不在 html 版本中。 在相关部分,它说:
7.14.1 左值 = 表达式
表达式的值替换左值引用的对象的值。操作数不必有 相同类型,但都必须是 int、char、float、double 或指针。如果两个操作数都不是指针,则赋值 像预期的那样发生,可能在右边的表达式转换之前。 当两个操作数都是 int 或任何类型的指针时,不会发生转换;表达式的值 被简单地存储到左值引用的对象中。因此,可以生成将导致寻址的指针 使用时例外。
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 运算 E2'';但是,E1 只计算一次。此外,像“i =+ p”这样的表达式,其中一个指针是 添加到整数,是被禁止的。
另外,L Rosler 在 'UNIX® SYSTEM: Readings and Applications, Volume II' 中发表了一篇论文 'Evolution of C',最初由 AT&T 作为 1984 年 10 月的技术期刊出版,后来由 Prentice-Hall 于 1987 年出版 (ISBN 0-13-939845-7)。其中一个部分是:
三。管理不兼容的更改
不可避免地,所做的一些更改会改变现有有效程序的语义。那些维护内部使用的各种编译器的人试图确保程序员有足够的警告,这些更改将生效,并且新编译器版本的引入不会强制所有程序立即重新编译。
例如,在最早的实现中,模棱两可的表达式
x=-1
被解释为“将 x 减 1”。它现在被解释为“将值 -1 分配给 x”。这一变化发生在三个年度主要版本的过程中。首先,编译器和lint
程序验证器进行了更改,以生成有关存在“老式”赋值操作(例如=-
)的消息警告。接下来,解析器更改为新语义,编译器警告不明确的赋值操作。最后,警告信息被消除了。支持使用“老式初始化”
int x 1;
(没有等号)被类似的策略删除。这有助于解析器生成更智能的语法错误诊断。
可以预见的是,一些 C 用户忽略了警告,直到引入不兼容的编译器迫使他们在更改过时的源代码或假设维护自己的编译器版本之间做出选择。但总的来说,分阶段变革的策略是成功的。
此外,在 Brian W Kernighan 和 Dennis M Ritchie The C Programming Language, 1st Edn (1978),在附录 A 的 p212,§17 时代错误,它说:
早期版本的 C 使用
=op
形式而不是op=
作为赋值运算符。这会导致歧义,表现为:x=-1
实际上减少了
x
,因为=
和-
是相邻的,但这可能很容易将-1
分配给x
。
【讨论】:
【参考方案3】:这只是赋值,然后是一元加号。
#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 初始化为非零值。如果你使用int a = 3;
,你会得到同样的结果吗?
@Hand-E-Food:实际上,他的测试并未将 a
初始化为零或任何其他值。
这并不是一个测试。我将a
的初始化放在它自己的行上的原因是让它更类似于我认为它在 OPs 源代码中的样子——我也许应该在声明和赋值之间放置/*other code*/
。【参考方案4】:
它是+=
的一个古老的已失效变体。在现代编译器中,这相当于赋值运算符后跟一元 +
。
【讨论】:
@Charles 我的母语不是英语,“defunct”怎么样? Deprecated 比英语更“标准”。 “Defunct”更好,因为它暗示它不起作用(在现代 C 实现中它不起作用); deprecated 表示它仍然受支持,但将来会被删除或删除。 我认为“已弃用”或“已失效”甚至“过时”都不是正确的描述。问题是代码a =+ 5
在现代标准中是完全有效的 C,但它在语义上并不等同于 a += 5
(如果曾经是 - 我会相信你的话,但我一直在使用 C自 1989 年以来)。如果@mugetsu 看到了这段代码,那么它更可能是一个错字(导致错误),而不仅仅是旧代码。
@onemasse:我的意思是要明确这种语法是有效的,但与+=
的含义不同,因此它没有被弃用或过时,而只是一个不明智的编码风格。
@Clifford 我已经澄清了。尽管这很可能是一个错字,但我认为提及其他解释是有道理的。我认为我们不应该排除有人通过 SO 搜索找到了古代 C 代码列表的可能性。另外,如果你知道它背后的历史,我想你可以更好地理解为什么要避免写 '=+' 而不仅仅是 '='。它不仅没有意义,而且还令人困惑。什么样的错字?可能是赋值加上加号,也可能是字符互换了。【参考方案5】:
我认为
a =+ 5;
应该等价于
a = (+5);
因此是非常糟糕的代码。
我尝试了以下代码并打印了“5”:
#include <iostream>
using namespace std;
int main()
int a=2;
a =+ 5;
cout << a;
【讨论】:
这个问题是关于C的,而你说的是C++。 我在 VS2010 中使用 .c 文件得到了相同的行为。【参考方案6】:阅读您的问题后,我刚刚对这些进行了调查。让我告诉你我发现了什么。在 gcc 和 turboc 上试过。没有在 Visual Studio 上确定,因为我没有在我的电脑上安装它
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
【讨论】:
【参考方案7】:使用“=+”你只是分配操作数是正数 例如 int a = +10;与负数相同 int a = -10;
【讨论】:
以上是关于=+ 在 C 中是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章