变量声明为副作用

时间:2014-02-03 21:36:21

标签: c++ c gcc comma

所以我正在查看C ++运算符规则,因为我的程序开始表现得很糟糕。我遇到了逗号运算符。现在,我知道它已经存在了一段时间但从未使用它,所以我开始阅读,我遇到了这个小宝石:

if (int y = f(x), y > x)
{
    // statements that use y
}

我从未想过使用逗号的“第一个参数”副作用来获取本地范围的变量,而不需要庞大的块分隔代码或重复的函数调用。当然,这一切都让我很兴奋,我立刻跑去尝试。

test_comma.cpp: In function 'int main()':
test_comma.cpp:9:18: error: expected ')' before ',' token
  if (int y = f(x), y > x) {

我在C和C ++编译器上都试过这个,但他们都不喜欢它。我尝试在外部作用域中声明y,并且在int条件下编译并运行时没有if,但这在这里违背了逗号的目的。这只是GCC实施的怪癖吗?互联网的观点似乎是,这应该是完全有效的C(表面上,在我看来,C ++)代码;在我见过的任何GCC或C ++论坛上都没有提到这个错误。


编辑:更多信息。我在Windows 7 64位上使用MinGW GCC 4.8.1-4(虽然我的二进制文件显然是32位;我需要在其中一天安装mingw-w64)。

我也试过在条件语句之外使用这个技巧,如下所示:

int y = (int z = 5, z);

这引发了两个不同的错误:

test_comma.cpp: In function 'int main()':
test_comma.cpp:9:11: error: expected primary-expression before 'int'
      int y = (int z = 5, z);
       ^
test_comma.cpp:9:11: error: expected ')' before 'int'

在我上面的if语句中创造性地使用括号,我也设法在那里得到了同样的错误。

3 个答案:

答案 0 :(得分:4)

与其他几个人声称的相反,declarations inside the if conditional are perfectly valid。但是,您的代码不是。

第一个问题是你实际上并没有使用逗号运算符,而是[几乎]试图声明多个变量。 That is not valid in an if conditional。而且,即使 可能,您的第二个声明仍会完全被破坏,因为您尝试重新声明y,而您使用>代替= }。这一切都没有意义。

以下代码有点类似:

if (int y = (f(x), y > x))

现在at least it's half-valid,但您使用y未初始化并产生未定义的行为。

声明和表达式不是一回事,所以以下是完全不同的代码:

int y = 0;
if (y = f(x), y > x)

现在你对未初始化的变量也没有问题(因为我自己初始化y),你得到的这个“副作用声明”不会改变结果值if有条件的。但它就像泥巴一样清晰。看看优先级如何形成:

int y = 0;
if ((y = f(x)), (y > x))

这不是非常直观。

希望这场彻底的灾难一直是避免这种神秘代码的一个教训。 :)

答案 1 :(得分:2)

您无法声明变量并同时应用operator ,要么声明变量(如果if只有一个'原因结果需要解析为bool),要么您正在撰写一些声明(也解析为bool),其中可能包含operator ,

答案 2 :(得分:0)

您需要在if条件的顶部声明y:

int y;

如果(Y = F(X)中,Y X的催化剂)

{

}

这将检查if条件中定义的最后一个条件,其他条件作为一般语句执行。