可变声明为副作用

Variable declaration as side-effect

本文关键字:副作用 声明      更新时间:2023-10-16

因此,我像开始行为不正当时一样,看着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条件和休息中定义的最后一个条件,将其他条件作为一般语句执行。