【问题标题】:Assignment of two values in parentheses in CC中括号中的两个值的赋值
【发布时间】:2009-09-15 15:59:57
【问题描述】:

这段C语言代码是做什么的:

p = (1, 2.1);

我们对p 了解多少?

【问题讨论】:

  • “我们对 p 了解多少?”听起来像一个家庭作业问题
  • 我知道这是你的第一个问题,这是一个很好的问题,但这里的大多数人似乎更喜欢没有问候的问题。不过,这没什么大不了的。此外,该站点具有一些格式化功能,您可以使用它来使您的代码看起来更好。我继续为你修好了 - 我希望你不介意。
  • 格伦,对我来说这听起来更像是一个深刻的哲学问题。
  • 只是因为添加“作业”的措辞听起来很奇怪。

标签: c syntax


【解决方案1】:

C 中的逗号操作符是一个序列点,表示用逗号分隔的表达式是从左到右执行的。整个表达式的 value 是最右边表达式的值,在您的情况下为 2.1,它被分配给变量 p

由于您示例中的表达式没有副作用,因此此处使用逗号分隔符毫无意义。

另一方面,括号很重要,因为赋值运算符 (=) 的绑定比逗号运算符强(它具有更高的优先级),并且会在没有括号的逗号运算符之前进行评估.因此,结果将是p == 1

【讨论】:

  • 在编写 C 代码的 20 年中,我还没有为逗号运算符找到真正有用的非骇客用法。
  • 您可以在 C++ 中重载运算符(但显然不是 C),Boost 很好地利用它来实现列表初始化,例如 list_type mylist = 1, 2, 3, 4, 5
  • @Graeme,我打赌你有时会发现 for(i = 0; i < n; i++, j--) ...; 很有用
  • Graeme,如果有很多 hackish 的,你为什么要非 hackish 使用?
  • 逗号操作符在定义上几乎是一个 hackish 操作符 - 它是在只允许一个的情况下破解两件事。
【解决方案2】:

这是一个错误。逗号运算符类似于;。它做一个,然后另一个。所以 (1,2.1) 的计算结果为 2.1

p 将为 2.1(或 2,如果 p 是 int 并且需要截断......)

【讨论】:

  • 不一定是错误,只是完全没用。
  • 嗯。您多久看到一次该功能并且这不是一个错误?是的,有可能,但极不可能,不是吗?
  • 我见过一次:在这里,它被用作家庭作业练习,以测试有关逗号运算符的知识。到目前为止,根据我见过的所有案例,以这种方式使用逗号运算符在 100% 的情况下都不是错误的。
  • 我见过 99% 的时间(在 CS 1 项目等中)是人们没有做 2D 数组... arr[3,5] != arr[3][5 ]...
【解决方案3】:

所有逗号分隔的表达式将从左到右进行计算,并返回最右边的表达式的值。

所以 p 将是 2.1。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多