2014-05-22 56 views
1

我想知道:用变量或等号设置一个变量有什么区别。变量之间使用等号还是冒号的区别

如:

struct file_operations ralink_gpio_fops = 
{ 
    owner:  THIS_MODULE, 
    ioct:  ralink_gpio_ioctl, 
    open:  ralink_gpio_open, 
    release: ralink_gpio_release, 
}; 

好像我可以用等号取代冒号。但似乎冒号有更多的含义,当它:

int i=0; 
printf("%d ",i); 
i:i++; 
printf("%d ",i); 
//goto i; 

在这种情况下,如果我goto i之前删除双斜线。它会回到i:i++;并继续运行。冒号有比平等更多的功能吗?或者他们完全不同?

回答

4

就像C中的其他一些东西一样,在不同的情况下,一些字符可能意味着不同的事物。

在第一个代码片段中,它用于从其初始化值分隔成员字段名称。这是而不是用于分配。此语法也不符合标准,但是您使用的任何编译器的一些扩展。

在第二个片段中,冒号用于将i标记为标签

你也说,在第一个例子中的冒号是用来代替“平等”,有你混的平等==的意义和分配=运营商。

0

您所谈论的两种情况完全不同,无论如何都不能将.替换为=

在行:

i: i++; 

这意味着有一个标签i(无关变量i)。它不会影响它后面的代码评估。这是相同的:

blarrg: 
    i++; 

// ... 
goto blarrg; 

struct类型的变量的声明,这是一个GCC扩展。该代码是标准C.标准C的指定初始化看起来像这样非法的:

.owner = THIS_MODULE; 
.ioctl = ralink_gpio_ioctl; 
0

这些都是GCC扩展C语言。 See Designated Initializers

+0

指定初始值设定项由C99指定(您链接的页面也指出)。所以我不再称他们为“扩展”。 – cnicutar

+2

@cnicutar gcc支持OP发布的指定初始值设定项的替代语法。不要问我为什么,但我想他们在C标准委员会有这样的想法之前已经做好了自己的努力。 –

+0

@MattMcNabb哦,我没注意。我站好了,谢谢! – cnicutar

1

在用法1中,“:”用于初始化。在这里你可以使用“=”运算符来替换“:”。但是它又是编译器特有的。

在用法2中,“:”用于将“i”标记为标签。

它不能被“=”代替。 i = i ++与i:i ++不同。

0

一个符号可以根据上下文使用不同的含义。假设 - 在表达式中被视为减法运算符,如a - b,并且相同的符号 - 在表达式中被视为负号 - 例如-a + b类似颜色(:)在不同的上下文中具有不同的含义。

何时:在第一种情况下(在结构定义中的结构元素处)使用时,它将设置位字段
通常当创建一个结构像
结构单元
{
int e1;
int e2:4;
int e3:6;
int e4:6;
};
上的16位的编译器,16位(2个字节)被分配用于E1,
4个比特被分配用于E2,
6位被分配用于E3和
6位被分配用于E4。
一起,结构的大小变成4个字节。
如果未指定位域,则结构的大小将变为8个字节。
为了有效利用内存,某些编译器提供了此(BIT-FIELDS)规定。

当您想要存储月份号码(可以在1到12之间)时,此机制很有用。如果使用正常的整数,那么在12位总是未被使用的情况下将使用16位。如果使用月份:4,我们可以保存这12位。


第二个是转到标签,我们最好不要使用它们。

相关问题