可能重复:
为什么 a+++++b 在 C 中不起作用?
我从 David Simon 的“An Embedded Software Primer”第 113 页得到了这个。
我在下面看到了这个声明:
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
你真的可以在这条线上有三个减号吗?三减号是什么意思?
我相信这是一个 C 编程语句。
可能重复:
为什么 a+++++b 在 C 中不起作用?
我从 David Simon 的“An Embedded Software Primer”第 113 页得到了这个。
我在下面看到了这个声明:
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
你真的可以在这条线上有三个减号吗?三减号是什么意思?
我相信这是一个 C 编程语句。
正确的答案是(如 Rob 所说)如下:
iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
原因是这样而不是
iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);
是一种称为最大咀嚼策略的约定,它表示如果下一个标记有多个可能性,则使用(咬)具有最多字符的那个。这种情况下的可能性是-
和--
,--
显然更长。
根据Draft C++11 (PDF) 2.5 Preprocessing tokens,第 3 条和Draft C11 (PDF) 6.4 Lexical elements,第 4 条,编译器将可能的最长字符序列解析为下一个标记。
这意味着---
将被解析为两个标记--
和-
,这给出
iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
这也表明,如果您不确定优先级或解析规则,请使用括号来阐明代码。
等于
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 个。
当然为什么不。这个说法
iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
相当于
iHoursTemp = iHoursTemp + iZoneNew -(--iZoneOld); //first decrement iZoneOld then perform rest of the arithmetic operation.
有点脑筋急转弯,但写起来很有趣:-)