2012-02-01 89 views
4

我一直在寻找一些MFC代码,我碰到这个表达式。它在OnInitDialog()函数中,看起来不像MFC特定的。变量有一些名称,值为0.表达式“variable,variable = value;”

int volatile something, somethingElse; //this was global 

something, somethingElse = 0; //this was inside the function 

这对C++有什么意义吗?我知道逗号运算符是如何工作的,尽管像这里这样的自由形式应该将表达式分开。变量名是否也是一个表达式?这段代码确实可以编译,所以这是如何工作的?

回答

6

这可能是程序中的错误。声明

a, b = c; 

完全等同于

b = c; 

由于逗号运算符从左至右评估,并丢弃除了最后所有值。由于表达式a没有副作用,所以它基本上是没有作用的。

我会怀疑这是程序员错误还是从不同语言的代码到C++的错误翻译。你应该联系作者,让他们知道这一点。

希望这会有所帮助!

+0

值得一提的是,由于所讨论的变量被声明为* global *,它很可能是程序中的错误。如果不是这种情况,可以使用该语句来避免* a上的*未使用变量*警告(假设它从未在程序中使用,但可能只是作为函数参数接收)并将'b'分配给'c' 。 – 2012-02-02 06:54:13

4

合法但有问题。逗号前的部分根本没有做任何事情。

4

这对C++有什么意义吗?

从句法上看,确实如此,但没有意见,你可能不知道开发者的意图是(如果有的话),而不是可能抑制变量警告。

变量名也是一个表达式吗?

是的变量本身就是一个表达式。防爆。 if(<expression>) if(something)

该代码确实编译,所以这是如何工作的?

它通过使用comma operator和忽视的something然后somethingElse分配0的结果。尽管something被标记为volatile,但原始开发人员可能拥有一个编译器,该编译器仍然抱怨未使用的变量,并成为聪明的开发人员,然后他决定使用该语法进行压缩。

4
something, somethingElse = 0; 

也许,这是为了避免对变量somethin克一个未使用的变量警告,somethingElse变量初始化为0

+0

+1对于一个合理的解释!对于这个想法,实际上是:)我使用自赋值('a = a')来抑制这些警告,但是一些IDE(例如Eclipse CDT)不喜欢它。 – 2012-02-01 19:38:19

+0

我也考虑过未使用的变量警告,但它似乎并不适用于这种情况 - 变量是全局变量。 – 2012-02-01 19:39:13

+0

@MarkRansom:你发现了我错过的厚颜无耻的评论:)实际上发现了。 – 2012-02-01 19:40:59