C编程:+;=vs=+;
我的教授和我正在讨论C中的+=运算符。他说+=或=+会起作用,但他不确定=+为什么起作用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
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问题)我想提供一个最不具体的答案,将海报推向解决方案的方向。我所学到和记住的一切都是我自己的。我忘了的一切都是用勺子舀的。