你能在C编程中有三个减号吗?这是什么意思?

Jos*_*Lee 56 c c++

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

我从David Simon的"嵌入式软件入门"第113页得到了这个.

我在下面看到这句话:

iHoursTemp = iHoursTemp + iZoneNew ---iZoneOld;
Run Code Online (Sandbox Code Playgroud)

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

我相信这是一个C编程声明.

Rob*_*obᵩ 92

它相当于:

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
Run Code Online (Sandbox Code Playgroud)

这符合最大 - 蒙克原则

  • 最后,一个完全正确的答案:) (9认同)
  • @Joseph Lee Noone想要编程.然而,它不是那个有问题的计算机(如果你有一个合适的编译器,它知道规则),但是人们总是无法理解这一点.说实话,我甚至不会做内联增量,比如'可读'版本,除非性能绝对不允许使它成为多个语句.因为即使人们能够阅读它的含义,真正理解它,也是不同的. (8认同)

imr*_*eal 49

正确答案是(如Rob所说)以下内容:

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
Run Code Online (Sandbox Code Playgroud)

原因是这样而不是

iHoursTemp = iHoursTemp + iZoneNew - (--iZoneOld);
Run Code Online (Sandbox Code Playgroud)

是一种称为最大咬合策略的约定,它表示如果下一个令牌有多种可能性,请使用(咬合)具有最多字符的那个.在这种情况下,可能性---,--显然是更长的时间.

  • s /束/ munch/:) (5认同)

Ola*_*che 12

根据Draft C++ 11(PDF) 2.5预处理令牌,第3节和草案C11(PDF) 6.4词汇元素,第4节,编译器将最长可能的字符序列解析为下一个标记.

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

iHoursTemp = iHoursTemp + (iZoneNew--) - iZoneOld;
Run Code Online (Sandbox Code Playgroud)

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

  • 就在这里.在C99中是§6.4词汇元素,第4段:"如果输入流已被解析为预处理令牌直到给定字符,则下一个预处理令牌是可构成预处理令牌的最长字符序列." 这被非正式地称为最大蒙克规则,如评论和其他答案中所述的不同时间. (22认同)
  • 在C++ 11中,它是在§2.5预处理令牌中,第3段:"如果输入流已被解析为预处理令牌,直到给定字符:[ - 原始字符串文字的规则] [ - 规则为`<::` ] - - 否则,下一个预处理令牌是可以构成预处理令牌的最长字符序列,即使这会导致进一步的词法分析失败." 看起来你看起来不够努力. (11认同)
  • 只允许其中一种解释. (3认同)
  • 很酷,不赞成不放弃这么多的downvotes.我只是还原我的,并给了你一个+1 :) (3认同)
  • 17倒,4倒 - 据我所知,这意味着@OlafDietsche在这个答案上获得了6点声望.分享和享受:-) (2认同)

Jey*_*ram 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;

}
Run Code Online (Sandbox Code Playgroud)

给我3个gcc.