C编程:+;=vs=+;

C编程:+;=vs=+;,c,operators,C,Operators,我的教授和我正在讨论C中的+=运算符。他说+=或=+会起作用,但他不确定=+为什么起作用 int main() { int i = 0, myArray[5] = {1,1,1,1,1}; while(i < 5) { myArray[i] += 3 + i; printf("%d\n", myArray[i]); i++; } system("pause"); } int

我的教授和我正在讨论C中的+=运算符。他说+=或=+会起作用,但他不确定=+为什么起作用

int main()
{
    int i = 0, myArray[5] = {1,1,1,1,1};

    while(i < 5)
    {
            myArray[i] += 3 + i;
            printf("%d\n", myArray[i]);
            i++;
    }

    system("pause");
}
intmain()
{
int i=0,myArray[5]={1,1,1,1};
而(i<5)
{
myArray[i]+=3+i;
printf(“%d\n”,myArray[i]);
i++;
}
系统(“暂停”);
}
输出将产生4、5、6、7、8。将+=运算符更改为=+将产生相同的结果。但是-=的作用与=-(这一点很明显,因为它将3视为3)

所以C大师:

  • 为什么使用=+
  • C编译器如何处理=+与+=

    • 他错了<代码>+=与
      =+
      完全不同

      表达式
      x=+3
      解析为
      x=(+3)

      在这里,
      +
      成为一元
      +
      运算符(相当无用)。(否定的反面)


      表达式
      x=-3
      使用一元否定运算符解析为
      x=(-3)

      +
      -
      一样也是一元运算符

      代码

      myArray[i] += 3 + i;
      
      将产生
      myArray[i]=myArray[i]+3+i

      鉴于

      myArray[i] =+ 3 + i;
      
      产量
      myArray[i]=3+i


      这就是我得到的。

      你的教授正在记忆古老的C语言版本,其中
      =+
      =-
      =*
      等实际上与
      +=
      -=
      *=
      等意思相同。(我们说的是比这里通常称为“K&R”的版本更旧的版本。如果内存可用的话,第6版UNIX。)

      在C的当前版本中,它们的含义并不相同;首先使用等号的版本将被解析,就像在等号和后面的任何内容之间有一个空格一样。这恰好为
      =-
      =+
      生成了一个有效的程序(尽管不是一个实现预期功能的程序),因为
      -
      +
      可以用作一元运算符


      =*
      =/
      可用于解决参数
      a*=3
      a
      乘以三,
      a/=3
      将其除以三,但
      a=*3
      是语义错误(因为一元
      *
      只能应用于指针),
      a=/3
      是语法错误(因为
      //code>不能用作一元运算符).

      使用什么编译器会产生相同的结果???将运算符更改为=+会产生
      3,4,5,6,7
      。也许你忘了在重新编译之前保存源文件或其他什么?你的教授不称职,应该退休了。是的,如果你看《狮子记》中的代码,你会发现它将运算符拼写为
      =+
      (它还包含该时期的一些其他C示例,比如在非结构类型上使用
      运算符)。这是B手册(C是从B改编而来),位于:。它显示了在第一个位置带有等号的ASING运算符。=+在70年代的某个时候从Unix版本6移动到Unix版本7时被更改为+=当时C语言还做了许多其他更改,主要是因为将其移植到PDP-11以外的机器上。
      a=*3
      不是语法错误,它是对整数值3的解引用,就像它是一个指针一样。大多数编译器都会因为类型冲突而发出警告,甚至生成错误,但不是语法错误。一些非常老的编译器甚至会接受它。@tristopia我想我使用的术语“语法错误”不准确。然而,根据标准,它是一个明确无效的程序;接受程序的编译器(有警告或没有警告)不是合格的编译器。(N1570:6.5.3.2p2节“一元
      *
      运算符的操作数应具有指针类型。”这是“约束”节中的“应”子句,必须根据5.1.1.3进行诊断。)您缺少使其实际回答问题的逻辑跳跃。对于像这样的问题(非API问题)我想提供一个最不具体的答案,将海报推向解决方案的方向。我所学到和记住的一切都是我自己的。我忘了的一切都是用勺子舀的。