【问题标题】:According to c standard j=i++ * i++ is undefined but j=i++ & i++ is legal why?根据 c 标准 j=i++ * i++ 是未定义的,但 j=i++ & i++ 是合法的,为什么?
【发布时间】:2013-10-22 18:06:27
【问题描述】:

根据标准c为什么它j= i++ * i++undefined和j=i++ & i++完全合法声明?

【问题讨论】:

  • 两者都未定义。你是说j=i++ && i++ ?
  • 按照标准你能提供章节吗?
  • 其实我的朋友从某个教练机构那里得到了这个问题,但我发现它有一些令人困惑的地方所以发布了。

标签: c post-increment


【解决方案1】:

它们都是未定义的行为。

j = i++ * i++; // undefined behavior
j = i++ & i++; // undefined behavior

在两个例子中,对象i的值在两个序列点之间被多次修改。

【讨论】:

    【解决方案2】:

    正如 Mystical 和 ouah 已经说过的,两者都是未定义的。

    j = i++ && i++;
    

    将被明确定义,因为 && 快捷方式,这意味着它必须首先评估左操作数,然后 - 如果左操作数为真 - 右操作数。

    【讨论】:

    • i++ && i++ 的定义不是因为捷径,而是因为&& 运算符在对第一个操作数求值后引入了一个序列点。
    • 可以快捷方式,还是必须快捷方式? :)
    • @ouah:没错,它必须这样做,因为它走捷径。
    • @JoãoFernandes:修复它。
    【解决方案3】:
    j= i++ * i++ ;
    
    j=i++ & i++ ;
    

    两者都是未定义的,因为改变了序列点之间的 i 值

    阅读Why are these constructs undefined behavior?

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2019-08-05
    相关资源
    最近更新 更多