因此,我像开始行为不正当时一样,看着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 编译器上都尝试过此操作,并且它们都不喜欢它。我尝试在外部范围内宣布y
,并且在if
条件下没有int
的情况下编译并运行正常,但是在这里却失败了逗号的目的。这只是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
语句中创造了括号的创造性使用,我也设法在那里遇到相同的错误。
与其他几个人所说的相反,有条件的if
内部声明是完全有效的。但是,您的代码不是。
第一个问题是您实际上不是使用逗号运算符,而是[几乎]试图声明多个变量。在if
中无效。而且,即使可能是,您的第二次声明无论如何都会完全破坏,因为您尝试重新运行y
,并且使用>
而不是=
。一切都没有意义。
以下代码类似:
if (int y = (f(x), y > x))
现在至少是 half falf - valid,但是您使用的是y
非注释并产生不确定的行为。
声明和表达式不是同一回事,因此以下是完全不同的代码:
int y = 0;
if (y = f(x), y > x)
现在,您也没有一个非初始化变量的问题(因为我自己初始化了y
),并且您会得到这种"副作用声明",该声明不会改变if
的结果值。但这和泥一样清晰。查看优先级的形式:
int y = 0;
if ((y = f(x)), (y > x))
那不是真的很直观。
希望这场巨大的灾难是避免完全避免这种神秘代码的一堂课。:)
您不能声明变量并同时应用operator ,
您要声明变量(如果if
,这只是一个'因为结果需要解决到bool
),要么您正在写一些结果语句(也可以解决bool
),其中可能包括operator ,
。
您需要在条件的顶部声明y:
int y;
if(y = f(x),y> x)
{
}
这将检查在IF条件和休息中定义的最后一个条件,将其他条件作为一般语句执行。