所以我正在查看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
语句中创造性地使用括号,我也设法在那里得到了同样的错误。
答案 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条件中定义的最后一个条件,其他条件作为一般语句执行。