C变量混淆
C variable confusion
在我的一项作业中,我看到使用了这一行:
int index = -1, k;
我不确定当有一个变量的条目时会发生什么。
当变量 "index" 有两个条目时,它究竟持有什么?
这是 2 个变量的定义,它们都是同一类型 int
:index
和 k
。只有index
用-1
初始化,k
没有初始化。
只是定义了两个int
类型的变量,其中一个(index
)初始化为-1,另一个(k
)未初始化。
顺便说一句,这是一种糟糕的风格,因为它看起来确实令人困惑。
这段代码中"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://en.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
.
逗号运算符的这种用法是好是坏取决于品味和环境。但是您可以肯定会在野外找到它的所有可能用途。
正如其他几个人所说,这是一个两个变量的声明。它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 上一次看到更多代码,但实际上我从来没有有过这样的经历,所以。)
在我的一项作业中,我看到使用了这一行:
int index = -1, k;
我不确定当有一个变量的条目时会发生什么。 当变量 "index" 有两个条目时,它究竟持有什么?
这是 2 个变量的定义,它们都是同一类型 int
:index
和 k
。只有index
用-1
初始化,k
没有初始化。
只是定义了两个int
类型的变量,其中一个(index
)初始化为-1,另一个(k
)未初始化。
顺便说一句,这是一种糟糕的风格,因为它看起来确实令人困惑。
这段代码中"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://en.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
.
逗号运算符的这种用法是好是坏取决于品味和环境。但是您可以肯定会在野外找到它的所有可能用途。
正如其他几个人所说,这是一个两个变量的声明。它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 上一次看到更多代码,但实际上我从来没有有过这样的经历,所以。)