是否有一个C的子集可以像这样写:i = + 1?

时间:2010-01-06 16:32:07

标签: c

我记得读过一本关于标准C编程语言的书。它在某种情况下说C你可以写i = + 1,等于i + = 1。所以i(运算符)=(表达式)等于i =(运算符)(表达式)。我从来没有见过这种C,是否有人可以解释这个?

致以最诚挚的问候和感谢, 范

6 个答案:

答案 0 :(得分:22)

这是C中+ =运算符的非常初始的语法。我认为它甚至在第一版K& R书之前就已被弃用。

编辑:可在此处找到带有C参考手册的PDF文件: http://www.math.utah.edu/computing/compilers/c/Ritchie-CReferenceManual.pdf 看看7.14.1

(唉,AnT发布的那个不再有效)

答案 1 :(得分:14)

这是事实。该版本的C称为CRM C(CRM代表“C参考手册” - 由Dennis Ritchie编写的文档)。在那个版本的C中有许多奇怪的东西。

您可以在http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf

下载文档

答案 2 :(得分:8)

Kernighan和Ritchie的 C编程语言,第一版解释了这一点。我在this post on comp.lang.c找到了引用。相关部分报价:

  

由于C是一种不断发展的语言,因此可能存在某些过时的结构   在旧程序中找到。虽然大多数版本的编译器都支持   如此不合时宜[ - 1978年 - ],最终它们将会消失,   只留下一个可移植性问题。

     

早期版本的C使用=op而非op=表单进行分配   运营商。这导致了歧义,以

为代表
x=-1
     

实际递减x,因为=-相邻,但   可能很容易将-1分配给x

维基百科也有类似的描述。来自their entry for C,谈论K& R C和“Old C”差异:

  

=op形式的复合赋值运算符(例如=-)已更改为op=形式,以消除由i=-10等构造创建的语义歧义,已被解释为i =- 10而不是可能的i = -10

答案 3 :(得分:1)

如果要为变量分配负数,肯定会出现问题。什么决定你的意思呢?间距? (ew!)或parenthetis(double ew!)。以下是一些显示问题的示例

i = -1; //Is this any different from the line below? Since when have spaces in these kind of cases mattered?
i =- 1; //If the suggested syntax existed, what would these two lines mean?

//The only thing left now (if we rule out making spaces matter) is to use parenthetis in my eyes, but...

i =(-1); //This is just ugly

正如评论中所指出的,用于取消引用指针的*符号与减号完全相同。

答案 4 :(得分:0)

这不是C.在标准C中,相当于i=1。可能是你正在寻找i++

答案 5 :(得分:0)

一点点空白可能有助于为您澄清这一点。

当你写i=+1时,实际发生的是i = +1。这是因为C中没有= +运算符。=被视为自己的运算符,而+是作用于常量1的一元运算符。因此,对该语句的评估从=运算符的右侧开始。 +1将评估为1,然后=运算符会将该值分配给变量i

+=是C中自己的运算符,这意味着“将此运算符右侧的表达式的值添加到左侧的变量中,并将其赋值给该变量,所以类似于以下内容:


i = 3;
i += 2;

将评估为5,因为+=运算符将评估运算符的右侧(在本例中为2),并将其添加到左侧(在本例中,我的值为3)并将其分配给左侧的变量。实质上,这变为i = (2 + 3)。因此,变量i的最终值为5

如果您只是将值1添加到整数变量,则可以使用++运算符。在变量(即i++)之后添加此运算符将导致当前代码行在将变量递增1之前执行。将变量前面的运算符加前缀将导致在变量递增后执行语句。

e.g:


i = 5;
j = i++;

将导致i = 6和`j = 5',而


i = 5;
j = ++i;

将产生i = 6j = 6

类似地,--运算符可用于将变量减1(减少)一个,类似于++将变量增加(增加)的方式。关于在变量之前或之后定位运算符的相同规则适用于两个运算符。

希望这可以解决一些问题。