C中= +的含义是什么?

mug*_*tsu 47 c operators

我在一些C代码中遇到=+了与标准相反的问题+=; 我不太确定这里发生了什么.我也在文档中找不到它.

Jer*_*fin 75

古代版本的C中,=+相当于+=.在最早的恐龙骨头旁边发现了遗留物.更重要的是,它没有特别的意义 - 它只是一个=后跟一个+.

  • 但它不再受支持,因为它与一元+模糊不清. (17认同)
  • @markgz:请参阅Dennis的[论文](http://www.lysator.liu.se/c/chistory.ps)(警告:Postscript)关于C历史的第5页. (8认同)
  • 我可以确认`= +`最初与当前的`+ =`相同.我不记得两者是否从一开始就是有效的,或者`= +`是最初的唯一选项,但无论如何,由于模糊性,它(非常正确地)被删除了. (3认同)
  • 它可能只是一个VAX的东西,但我发誓我被教导+ =是preincrement,而且= +是后增量,我记得我们几乎总是完全相同的东西......但不是复杂的操作顺序问题. (3认同)
  • 谢谢,杰里.对于那些感兴趣的人,报纸上写着以下关于"= +":"......这个错误,在1976年修复......".1976年是在我的时间之前. (3认同)
  • @MCG:在现代 C(或 C++)中,“c =+ x;”将“x”的值(正或负)分配给“c”(“c = +x;”)。它不会将“x”的负值更改为正值。‘+’ 是一个空操作。 (2认同)

Jon*_*ler 34

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

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

7.14.1 lvalue =表达式

表达式的值替换了左值引用的对象的值.操作数不必具有相同的类型,但两者必须是int,char,float,double或pointer.如果两个操作数都不是指针,则赋值按预期进行,可能在右侧表达式转换之前.当两个操作数都是int或任何类型的指针时,都不会发生转换; 表达式的值只是存储在左值引用的对象中.因此,可以生成指针,这些指针在使用时将导致寻址异常.

7.14.2 lvalue = + expression
7.14.3 lvalue = - expression
7.14.4 lvalue =*expression
7.14.5 lvalue =/expression
7.14.6 lvalue =%expression
7.14.7 lvalue = >> expression
7.14.8 lvalue = <<表达式
7.14.9 lvalue =&expression
7.14.10 lvalue = ^ expression
7.14.11 lvalue = | 表达

形式为''E1 = op E2''的表达式的行为可以通过将其等同于''E1 = E1 op E2''来推断; 但是,E1仅评估一次.此外,禁止将指针添加到整数的"i = + p"这样的表达式.


另外,L Rosler在"UNIX®系统:读物和应用,第二卷"中有一篇论文" C演变 ",最初由AT&T出版,作为1984年10月的技术期刊,后来由Prentice-Hall于1987年出版(国际标准书号0-13-939845-7).其中一部分是:

III.管理不兼容的更改

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

例如,在最早的实现中,模糊表达x=-1被解释为表示"将x递减1".它现在被解释为"将值-1分配给x".这一变化发生在三个年度主要版本的过程中.首先,lint更改编译器和程序验证程序以生成关于存在"老式"赋值操作的消息警告,例如=-.接下来,解析器被更改为新的语义,编译器警告模糊的赋值操作.最后,消除了警告信息.

支持使用"老式初始化"

int x 1;
Run Code Online (Sandbox Code Playgroud)

(没有等号)被类似的策略所取代.这有助于解析器生成更智能的语法错误诊断.

可以预见的是,一些C用户忽略了警告,直到引入不兼容的编译器迫使他们在更改过时的源代码或假设维护自己的编译器版本之间做出选择.但总的来说,分阶段变革的策略是成功的.


use*_*653 12

这只是一次性的加分.

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

打印"5".更改a =+ 5a =- 5并打印"-5".a =+ 5可能更容易阅读a = +5.


one*_*sse 9

它是'+ ='的一个古老的已解散变体.在现代编译器中,这相当于赋值运算符后跟一元"+".

  • 真的_ancient_. (5认同)

Hei*_*nzi 6

我认为

a =+ 5;
Run Code Online (Sandbox Code Playgroud)

应该相当于

a = (+5);
Run Code Online (Sandbox Code Playgroud)

因此是非常糟糕的代码.

我尝试了以下代码并打印"5":

#include <iostream>
using namespace std;

int main()
{
    int a=2;
    a =+ 5;
    cout << a;
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是关于C的,你在谈论C++. (8认同)