【问题标题】:Strange multi-variable assignment statement in CC中奇怪的多变量赋值语句
【发布时间】:2014-09-03 19:37:11
【问题描述】:

我以为我理解 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;
}

你为什么要使用这样一个似乎同时执行 2 个不相关操作的行?

【问题讨论】:

  • 如果你问我,这正是我所说的坏习惯。令人困惑的是,, 运算符具有不同的含义,具体取决于它的使用位置(表达式、此处显示的声明和参数列表。)

标签: c graphics variable-assignment


【解决方案1】:

声明

int d = a, b, c;

在功能上与

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

变量d被初始化为a的值,bc都未初始化。

【讨论】:

    【解决方案2】:

    d 右上方的a

    int d = a, b, c;  
    

    是一个初始化器,这里使用的=不是赋值运算符。

    【讨论】:

      【解决方案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 个,允许您更定期地复制/剪切和粘贴代码,而不是尝试维护声明列表,这将导致浪费时间一遍又一遍地重新格式化以提高可读性,而不是不仅仅是为类型、标识符和任何初始化程序排列一次列。

      关于逗号表达式,维基百科有一些很好的例子,并在声明中指出“逗号充当分隔符”-Comma operator。例如,在数组下标n = foo[ a++, b] 中使用逗号表达式被认为是一种非常糟糕的风格,因为它的意图会误导任何习惯使用其他语言或数学符号的人。

      【讨论】:

      • 谢谢。我基本上已经弄清楚发生了什么。感谢您澄清有关样式和最佳实践的问题,这正是我要问的。
      猜你喜欢
      • 2012-12-15
      • 2011-04-08
      • 2020-06-27
      • 2012-12-16
      • 2015-04-01
      • 2016-06-01
      • 2021-08-13
      • 1970-01-01
      相关资源
      最近更新 更多