繁体   English   中英

C变量混乱

[英]C variable confusion

在我的一项作业中,我看到使用了以下行:

int index = -1, k;

我不确定当有一个变量的条目时发生了什么。 当变量“ index”具有两个条目时,到底拥有什么?

这是2个变量,无论是相同类型的定义intindexk 只有index-1初始化,而k未被初始化。

它只是定义了两个int类型的变量,其中一个( index )初始化为-1,另一个( k )未初始化。

顺便说一句,这真的很令人困惑。

正如其他几个人所说,这是两个变量的声明 它等于100%

int index = -1;
int k;

现代编码风格会鼓励您以这种方式编写。 但是-那里有很多旧的C语言,在1980年代和1990年代, 对变量声明进行分组是首选的样式。 选择一个随机的尘土飞扬的甲板,我保证您会看到类似

register f, r, (*hstat)(), (*istat)(), (*qstat)();
int status;

或者可能

extern char level;
int newtry[31],newother[31],*r,*q,*p,n,sum,first;
int ii,lastwhite,lastred;

因此,您需要了解其含义。 可悲的是,他们会变得非常混乱,例如

int const* a, b;

相当于

const int *a;
int b;

这就是为什么现代编码样式更喜欢每个声明使用一个变量的原因。

(为什么人们还是喜欢在一天中对声明进行分组?我不知道。我个人认为,这可以帮助您在80x25玻璃tty上一次查看更多代码,但是我从未真正拥有过这种经验,所以)

在此代码中,“ index”和“ k”都是整数类型变量,并且变量“ index”由-1分配(即index的值为-1)。 这称为变量初始化。

假设这是函数范围内的代码:

int index = -1, k;

将做与

int index = -1;
int k;

或与

int index, k;
index = -1;

即使代码与C标准不相等,世界上没有已知的C编译器会对这三个代码块进行任何不同的处理。

在C语言中,您可以一次声明多个相同类型的变量( int index, k; ),也可以定义一个变量(同时声明和初始化变量, int index = -1; ),或者可以在一次,声明多个并初始化它们,或者根据您的情况仅初始化其中一个( int index = -1, k; )。

在C中,逗号运算符,具有比赋值操作符优先级 = 这样,表达

int index = -1, k;

被解析为

//The parentheses are not legal in C, but it's what the parser does.
int ((index = -1), k);

您会看到,该行声明了int类型的变量。 第一个称为index且初始化为-1 ,第二个称为k且未初始化。

您可以在此处找到有关运算符优先级的良好概述:
https://zh.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence
请注意,逗号运算符是该列表中的最后一个!


同样,您可能会看到类似或类似的C代码:

if(condition) foo += 7, doSomething();
while(i += 2, i < 42) ...;

这相当于

if(condition) {
    foo += 7;
    doSomething();
}

i += 2;
while(i < 42) {
    ...
    i += 2;
}

但是更简洁(许多C程序员喜欢简洁!)。 同样,在两种情况下,逗号运算符都将两件事融合为一条语句,这避免了编写完整的块{}并防止重复增量i += 2

逗号运算符的这种用法是好是坏,这取决于口味和环境。 但是您可以肯定会在野外找到它的所有可能用途。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM