59

可能重复:
为什么 a+++++b 在 C 中不起作用?

我从 David Simon 的“An Embedded Software Primer”第 113 页得到了这个。

我在下面看到了这个声明:

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

你真的可以在这条线上有三个减号吗?三减号是什么意思?

我相信这是一个 C 编程语句。

4

5 回答 5

95

它相当于:

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

这符合最大咀嚼原则

于 2012-12-14T07:12:41.227 回答
49

正确的答案是(如 Rob 所说)如下:

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

原因是这样而不是

iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);

是一种称为最大咀嚼策略的约定,它表示如果下一个标记有多个可能性,则使用(咬)具有最多字符的那个。这种情况下的可能性是-----显然更长。

于 2012-12-14T07:22:48.113 回答
12

根据Draft C++11 (PDF) 2.5 Preprocessing tokens,第 3 条和Draft C11 (PDF) 6.4 Lexical elements,第 4 条,编译器将可能的最长字符序列解析为下一个标记。

这意味着---将被解析为两个标记---,这给出

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;

这也表明,如果您不确定优先级或解析规则,请使用括号来阐明代码。

于 2012-12-14T07:11:02.950 回答
5

等于

iHoursTemp = iHoursTemp + (iZoneNew--) -iZoneOld;

#include <stdio.h>

int main()
{

int iHoursTemp = 2, iZoneOld = 3, iZoneNew = 4;

//2+4 - 2 = 4
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
//2+(4--) -3 = 3   

printf("\n :%d \n", iHoursTemp);

return 0;

}

在 gcc 中给我 3 个。

于 2012-12-14T07:07:54.030 回答
-9

当然为什么不。这个说法

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;

相当于

iHoursTemp = iHoursTemp + iZoneNew -(--iZoneOld); //first decrement iZoneOld then perform rest of the arithmetic operation.

有点脑筋急转弯,但写起来很有趣:-)

于 2012-12-14T12:51:16.603 回答