问题标签 [comma-operator]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
1444 浏览

c - 为 C 示例中的棘手问题推荐一本书

可能的重复:
','运算符在 C 中做了什么?

好的,我今天接受了采访,他们问我以下代码的输出应该是什么

在我的机器上运行它之后,我能够得到答案,但我无法在那里回答。我想知道是否允许这样的 if 语句?它在哪里提到?

我的问题是上面提到的 if 条件我无法理解 if 语句是如何工作的。

**更新**
我在 K&R 中没有发现任何这样的东西,任何人都可以推荐一本好书。我已经编写了一些东西,对 C 并不陌生,但在这个问题失败后,我想再次深入了解更多 C 概念(特别是上面提到的)我可以在哪里阅读。

0 投票
3 回答
2305 浏览

c++ - C++中的逗号运算符和逗号分隔符

可能重复:
什么时候逗号运算符不充当逗号运算符?

comma(,) 什么时候充当运算符,什么时候充当分隔符?它的后果是什么。如果可能,请为两者都举几个小例子。

0 投票
1 回答
993 浏览

c++ - 重载逗号运算符*真的*会影响其操作数的评估顺序吗?

逗号运算符保证从左到右的评估顺序。

[n3290: 5.18/1]:逗号运算符从左到右分组。

一对用逗号分隔的表达式从左到右求值;左边的表达式是丢弃的值表达式(第 5 条)。与左表达式关联的每个值计算和副作用都在与右表达式关联的每个值计算和副作用之前排序。结果的类型和值是右操作数的类型和值;结果与其右操作数属于相同的值类别,并且如果其右操作数是泛左值和位域,则结果是位域。

关于运营商的唯一其他条款没有提到评估顺序。因此,当运算符超载时,情况似乎仍然如此。

但是,再往前说,在关于表达式的一般说明中,当然,当您重载运算符时,规则会发生变化:

[n3290: 5/2]:[注意:操作符可以被重载,也就是说,当应用于类类型(第 9 条)或枚举类型(7.2)的表达式时,赋予其含义。重载运算符的使用被转换为函数调用,如 13.5 中所述。重载运算符遵循第 5 章中规定的语法规则,但操作数类型、值类别和评估顺序的要求被函数调用规则所取代。运算符之间的关系,例如++a 含义a+=1,对于重载的运算符(13.5)不保证,对于类型的操作数也不保证bool——尾注]

但是,这是非规范性文本。是否有任何规范性文本定义此规则,或者兼容的编译器是否可以忽略它?

0 投票
2 回答
2477 浏览

c++ - 禁止使用逗号运算符

我从不使用逗号运算符。
但有时,当我写一些递归时,我会犯一个愚蠢的错误:我忘记了函数名。这就是为什么返回最后一个操作数,而不是递归调用的结果。

简化示例:

是否有可能出现编译错误而不是错误的、难以调试的代码?

0 投票
4 回答
3334 浏览

c++ - 为什么用逗号进行双重初始化是非法的?

我有三个代码片段。这个:

编译好。这个:

也可以编译。然而这个:

无法编译。gcc-4.3.4 说

错误:数字常量之前的预期不合格 id

和 Visual C++ 10 说

错误 C2059:语法错误:“常量”

为什么会有这样的差异?为什么所有三个编译器都没有,在所有三个中具有相同的效果?

0 投票
5 回答
302 浏览

c++ - 为什么下面的代码不会产生编译错误?

我正在使用 VS2005 编译器,我希望下面的代码会给出编译错误。

赋值后的值为3。根据我的理解,它应该给出编译错误。

我很高兴知道这背后是否有任何正当理由。

0 投票
1 回答
666 浏览

c++ - 实现是否应该防止逗号重载?

例如uninitialized_copy在标准中定义为:

效果:

如果从字面上理解,这是调用的要求operator ,(ForwardIterator, InputIterator)。事实上,这段代码打印Hello world!了十次:

然而,对于大多数其他算法,该标准以散文形式给出了描述。例如,copy不需要调用操作员,。但如果我改变

在上面的代码中

然后Hello world!还是打印了十次。上述结果在 VS2005 和 GCC 4.3.4 中都可以观察到。但是,如果我写

相反,然后 VS2005 打印Hello world!十次,但 GCC 没有。

不幸的是,我找不到标准禁止operator,迭代器类型重载的地方。相反,它禁止实现如上述 [global.functions] 进行调用:

除非另有规定,标准库中的全局和非成员函数不应使用来自另一个命名空间的函数,这些函数是通过参数相关名称查找 (3.4.2) 找到的。

那么四方谁错了:MSVC、GCC、ISO 还是我?(选一个)

0 投票
3 回答
12560 浏览

javascript - Javascript“元组”表示法:它的意义何在?

wtfjs,我发现以下是合法的 javascript。

这个参数(null,'cool',false,NaN,4)对我来说看起来像一个元组,但 javascript 没有元组!

我的 javascript 控制台中的一些快速测试会产生以下结果。

它的行为似乎与分号;分隔的语句列表完全一样,只是返回最后一条语句的值。

在某处是否有描述此语法及其语义的参考?它为什么存在,即何时应该使用它?

0 投票
1 回答
77 浏览

c - C中错误的多维数组变量增加

我很想知道在 C 中增加的多维数组的行为如下:

我知道那是错误的方式。我只想知道编译器在这种情况下做了什么,如果程序员在他的代码中这样做会产生什么后果。

0 投票
15 回答
34428 浏览

javascript - 逗号运算符什么时候有用?

我读过这个关于表达式 ( ,) 中“逗号运算符”的问题和关于它的MDN 文档,但我想不出它有用的场景。

那么,逗号运算符什么时候有用呢?