这个函数调用“ delay +(1000)”在语法上是否正确?

Sau*_*ari 3 c c++ arduino-ide

我正在编写一个小代码,以在传感器读数超过特定阈值时启用蜂鸣器。要启用一秒钟蜂鸣器,我给了1000毫秒的延迟通过调用这个函数:delay(1000)。但是,我是随机输入的delay+(1000),并且编译良好。该函数调用在语法上正确吗?

我已经在Arduino IDE上尝试过此代码。它可以编译,但对于avr-gcc或avr-g ++或gcc / g ++来说并非如此。

我希望delay +(1000)无法编译,因为它似乎不是有效的c / c ++语法。

更新1:

使用Arduino IDE编译并上传以下代码片段至Arduino UNO:

void setup() 
{
    Serial.begin(9600);
}

void loop()
{
    int x = delay+(1000);
    Serial.println(x);
}
Run Code Online (Sandbox Code Playgroud)

它连续打印一个随机数1132,没有任何延迟。(因此1132 =>功能指针地址+ 100?)

我还观察到delay+(1000)delay-(1000)编译,但对于delay*(1000)和则并非如此delay/(1000)。编译器给出以下错误:

sketch_jun09a:8:错误:类型为“ void(long unsigned int)”和>“ int”类型的无效操作数为二进制“ operator *”

     delay*(1000);
               ^
Run Code Online (Sandbox Code Playgroud)

但是,int t = (int)delay*(1000);编译效果很好。

更新2:

根据以下答案,delay<operator>(x)仅执行函数指针算术(使用一元或二进制运算符),而不执行函数本身。

我使用了以下代码片段:

void setup()
{
    Serial.begin(9600);
}
int custom()
{
    Serial.println("hello");
    return 0;
}
void loop()
{
    custom+(1000);
    delay+(1000);
}
Run Code Online (Sandbox Code Playgroud)

它编译良好,什么也不输出。

更新3:

我在Arduino IDE的“首选项”下将“编译器警告”级别更改为“全部”。在编写此代码段时,

void setup() 
{
    delay+(1000);
}
void loop() {}
Run Code Online (Sandbox Code Playgroud)

获得以下警告:

sketch_jun09a.ino:在函数'void setup()'中:sketch_jun09a.ino:3:14:警告:指向用于算术[-Wpointer-arith]的函数的指针

  delay+(1000);
             ^
Run Code Online (Sandbox Code Playgroud)

sketch_jun09a.ino:3:8:警告:语句无效[-Wunused-value]

  delay+(1000);
       ^
Run Code Online (Sandbox Code Playgroud)

Jos*_*hua 7

所以这里有两件事。

delay+(1000)
Run Code Online (Sandbox Code Playgroud)

是在函数指针延迟上加上1000的语法。当然哪个是完全没有意义的,但是为什么要编译呢。通常,您可以将整数添加到指针,但这不适用于void *指针和函数指针。gcc但是有一个扩展,可以通过给定类型和大小1 来添加void *void(*)()工作。因此,向函数添加整数是可行的(无用)。voidvoid()

事实证明,向void *指针添加整数有时是您实际上想要执行的操作,并且扩展程序摆脱了一些烦人的额外局部变量,但是函数指针几乎永远不会那样工作。我猜有人在不久前建立了asm代码,因为这是我能想象的唯一用例。提示:在某些体系结构上,函数指针不是指向函数代码而是指向描述符。