C中的奇怪多变量赋值语句

时间:2014-07-13 21:35:03

标签: c graphics variable-assignment

我以为我理解C语言中的赋值操作,但我正在尝试学习一些图形编程,并且我遇到了这个初始化语句让我感到困惑:

/* request auto detection */
int gdriver = DETECT, gmode, errorcode

我使用元素编译了一个小的工作程序,结果似乎是赋值和声明的组合。 RHS上的第一个变量分配给LHS变量,其余变量被声明(但未初始化)为LHS变量的类型......

#include <stdio.h>

int main(){

    int a = 0;  // Comment out this line and things break
    int d = a, b, c;

    printf("%d %d %d %d", a, b, c, d);

    return 0;
}

为什么你会使用这样的一行似乎一起执行两个不相关的行为?

3 个答案:

答案 0 :(得分:8)

声明

int d = a, b, c;

在功能上与

相同
int d = a;
int b;
int c;

变量d初始化为abc都未初始化。

答案 1 :(得分:3)

为了回答第二部分,有人很可能延长了初始化声明,或者将初始化声明放在那里而不是分配,而不是过多关注清晰度。在一行上一起声明时,为了清楚起见,赋值表达式有助于:

double x, y, z; x = y = z = 0.0;

所以在这个例子中,我更喜欢,如果它比多行清晰:

/* request auto detection */
int gdriver = DETECT; int gmode, errorcode;

使用C11(或C99)编译器很不错,因为您可以像C ++一样初始化近用法。在大型软件工程项目中,我基本上发现几乎总是更好地编写,每行声明1(变量紧密耦合的情况除外),因为必须添加1或2是非常常见的更多,稍后更改名称或类型,每行更改1,允许您复制/剪切&amp;粘贴代码的次数比你试图维护声明列表要多,这会导致重复格式化时间浪费时间以便于阅读,而不是只为列表排列一次类型,标识符和任何初始化。

在逗号表达式上,维基百科有一些很好的例子,并在声明中指出&#34;逗号作为一个分隔符&#34; - Comma operator。例如,在数组下标n = foo[ a++, b]中使用逗号表达式被认为是非常糟糕的风格,因为它的意图对于习惯于使用其他语言或数学的符号的人来说是非常误导的。

答案 2 :(得分:1)

a的RHS上的d
int d = a, b, c;  

是初始值设定项,此处使用的=不是赋值运算符。