C语言 变量前使用等号或冒号的区别

az31mfrm  于 2023-01-20  发布在  其他
关注(0)|答案(5)|浏览(277)

我在想:用冒号或等号设置变量有什么区别。
例如:

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++;并继续运行。那么冒号的函数比等号多吗?还是它们完全不同?

zd287kbt

zd287kbt1#

就像C语言中的其他一些东西一样,一些字符在不同的情况下可以表示不同的东西。
在第一个代码片段中,它被用来分隔成员字段名和它们的初始化值。它 * 不 * 像赋值那样使用。这种语法也不符合标准,而是你所使用的任何编译器的某种扩展。
在第二个代码片段中,冒号用于将i标记为 label
您还说在第一个示例中使用了冒号而不是“equal”,并且在那里混淆了 equality==assignment=操作符的含义。

hl0ma9xz

hl0ma9xz2#

在用法1中,“:“用于初始化。这里你可以使用“=”运算符来替换“:“。但它同样是编译器特定的。
在用法2中,“:“用于标记“i”作为标签。
不能用“="替换。i=i不同于i:i

taor4pac

taor4pac3#

您所讨论的两种情况完全不同,在这两种情况下,.无论如何都不能替换=
行中:

i: i++;

这意味着有一个标签i(与变量i无关)。它不影响后面代码的求值。这与以下代码相同:

blarrg: 
    i++;

// ...
goto blarrg;

struct类型变量的声明中,这是一个GCC扩展。该代码在标准C中是非法的。标准C的 * 指定初始化器 * 如下所示:

.owner = THIS_MODULE;
.ioctl = ralink_gpio_ioctl;
p4rjhz4m

p4rjhz4m5#

一个符号可以被使用在不同的意义基于这上下文.假设,-被当做减法运算符在这表达式象a-b并且同样的符号-被当做负号在这表达式象-a + b
类似地,color(:)在不同的上下文中有不同的含义。
当在第一种情况下(在结构定义中的结构元素处)使用:时,它将设置位字段
通常,当创建结构时,如
结构单元
{
内部e1;
中间e2:4;
中间e3:6;
中间e4:6;
};
在16位编译器上,16位(2字节)分配给e1,
4比特被分配给e2,
6比特被分配给e3
6比特被分配给e4。
合起来,结构的大小变为4字节。
如果未指定位字段,则结构的大小将变为8字节。
为了有效地利用内存,一些编译器提供了这种(BIT-FIELDS)。
当您想要存储月份数字(可以在1到12之间)时,这种机制非常有用。如果使用正常整数,则会使用16位,而12位总是不使用。如果使用month:4,则可以节省这12位。
第二个是一个goto标签,我们最好不要使用它们。

相关问题