当C中没有左侧时,&&操作符是做什么的?

我看到一个C程序,其代码如下:

static void *arr[1] = {&& varOne,&& varTwo,&& varThree}; varOne: printf("One") ; varTwo: printf("Two") ; varThree: printf("Three") ; 

我对“ &&操作感到困惑,因为左边没有任何内容。 它默认评估为空吗? 或者这是一个特例?

编辑:添加一些更多的信息,使问题/代码更清晰的我的问题。 谢谢大家的帮助。 这是gcc特定扩展的一个例子。

这是一个gcc特定的扩展,是一个可以应用到标签名称的一元&&运算符,产生一个void*值的地址。

作为扩展的一部分, goto *ptr; 是允许的,其中ptrvoid*types的expression式。

这里logging在gcc手册中。

您可以使用一元运算符&&获得当前函数(或包含函数)中定义的标签的地址。 该值具有typesvoid * 。 这个值是一个常量,可以用在任何types的常量有效的地方。 例如:

 void *ptr; /* ... */ ptr = &&foo; 

要使用这些值,您需要能够跳转到一个。 这是用计算的goto语句来完成的, goto *exp; 。 例如,

 goto *ptr; 

任何types的void *expression式都是允许的。

正如zwol在评论中指出的那样,gcc使用&&而不是更加明显&因为一个标签和一个名字相同的对象可以同时被看到,如果&意味着“标签的地址”,那么& &foo可能是不明确的。 标签名称占用了自己的名称空间(不是C ++的意思),并且只能出现在特定的上下文中:由标签语句定义,作为goto语句的目标,或者作为gcc的目标,作为一元&&的操作数。

这是一个gcc扩展,被称为“作为值标签”。 链接到gcc文档 。

在这个扩展中, &&是可以应用于标签的一元运算符。 结果是void *types的值。 这个值稍后可以在goto语句中取消引用,以使执行跳转到该标签。 而且,这个值也允许指针运算。

标签必须处于相同的function; 或者在代码也使用“嵌套函数”的gcc扩展的封闭函数中。

这里是一个示例程序,其中的function是用来实现一个状态机:

 #include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) { void *tab[] = { &&foo, &&bar, &&qux }; // Alternative method //ptrdiff_t otab[] = { &&foo - &&foo, &&bar - &&foo, &&qux - &&foo }; int i, state = 0; srand(time(NULL)); for (i = 0; i < 10; ++i) { goto *tab[state]; //goto *(&&foo + otab[state]); foo: printf("Foo\n"); state = 2; continue; bar: printf("Bar\n"); state = 0; continue; qux: printf("Qux\n"); state = rand() % 3; continue; } } 

编译和执行:

 $ gcc -ox xc && ./x Foo Qux Foo Qux Bar Foo Qux Qux Bar Foo 

我不知道在C中有这种方式的任何操作符。取决于上下文,C中的&符号可能意味着许多不同的事物。

地址 – 运营商

在左值之前,例如

 int j; int* ptr = &j; 

在上面的代码中, ptr存储j的地址,&在这个上下文中取任何左值的地址。 下面的代码,如果是这样写的话,对我来说会更有意义。

 static int varOne; static int varTwo; static int varThree; static void *arr[1][8432] = { { &varOne,&varTwo, &varThree } }; 

逻辑与

逻辑AND运算符更简单,与上面的运算符不同,它是一个二元运算符,意味着它需要一个左和右操作数。 它的工作方式是通过评估左和右操作数并返回true,如果两者都为真,或者如果它们不是bool,则返回大于0。

 bool flag = true; bool flag2 = false; if (flag && flag2) { // Not evaluated } flag2 = true; if (flag && flag2) { // Evaluated } 

按位与

C中&符号的另一个用途是执行按位AND。 它与逻辑AND运算符类似,只是它只使用一个和符号,并在位级执行AND操作。

让我们假设我们有一个数字,它映射到下面显示的二进制表示,AND操作就像这样:

 0 0 0 0 0 0 1 0 1 0 0 1 0 1 1 0 --------------- 0 0 0 0 0 0 1 0 

在C ++领域,事情变得更加复杂。 &符号可以放在一个types之后,用来表示一个引用types(你可以把它看作是一个不太强大但安全的指针types),那么事情会变得更加复杂:1)当两个&符号放在一种。 2)在模板types或自动扣除types之后放置两个&号时的通用引用。

我认为你的代码可能只是在你的编译器中编译,因为有些types的扩展。 我正在考虑这个https://en.wikipedia.org/wiki/Digraphs_and_trigraphs#C但我怀疑是这样的。;