【问题标题】:What is the value of the following expression ? I = 1; I = (I<<= 1 % 2) (a) 2 (b) 1 (c) 0 (d) syntax error [closed]以下表达式的值是多少?我 = 1; I = (I<<= 1 % 2) (a) 2 (b) 1 (c) 0 (d) 语法错误 [关闭]
【发布时间】:2013-06-08 03:50:31
【问题描述】:

以下表达式的值是多少?

      I = 1;
      I = (I<<= 1 % 2)

从以下选择:

(a) 2     
(b) 1      
(c) 0      
(d) syntax error

【问题讨论】:

  • 你试过运行它吗?
  • 我心情不错..ideone.com/nJlKTA
  • 在这种情况下,运行它并没有真正的好处——因为它具有未定义的行为,从编译器到编译器标志再到月相的任何差异都可能导致不同的结果。
  • 是说“在下面的表达式中”,但给出的代码有多个表达式。
  • 或 (e) 从您的应用程序中删除此代码并解雇原作者

标签: c


【解决方案1】:

在第一个表达式中,值显然是1

在第二个表达式中,您有未定义的行为,因为 I 被修改了两次而没有干预 sequence point

【讨论】:

  • 这给我的印象是这个问题可能来自面试或学术界,但写这个问题的人实际上没有资格这样做;-D
  • @NikosC。您可能是正确的,因为undefined behavior 不是答案选项,因此问题无效。我根据选项回答(这就是为什么在评论中
  • @Jim:很多人都这么认为,但他们错了。赋值运算符创建一个序列点。 C99,第 6.5/2 节:“在前一个和下一个序列点之间,对象的存储值最多只能通过表达式的评估修改一次。”
  • @JimBalter:必须先评估(I&lt;&lt;= 1 % 2) 的结果,然后才能将结果分配给I,但修改I 的副作用不必如此。 I 被修改了两次,没有插入序列点,因此行为未定义。
  • @KeithThompson:虽然这确实似乎更合理,但也不完全准确。例如,由于 I 的值在表达式之前是已知的,编译器可以在编译时预先计算 this 的任意部分,因此明显的依赖关系完全消失。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2015-07-31
  • 1970-01-01
  • 2014-12-29
  • 2018-07-29
  • 1970-01-01
  • 2012-12-16
  • 2022-07-13
相关资源
最近更新 更多