【问题标题】:Evaluation on the right side of an assignment作业右侧的评估
【发布时间】:2012-02-09 20:09:36
【问题描述】:

这个int c = (a==b) 正是我想在我的C 程序中说的,用GCC 编译。我可以做到,显然(它工作得很好),但我不知道它是否会导致未定义的行为。我的程序不会用其他编译器或其他架构编译。这是合法的ANSI C吗?谢谢。

【问题讨论】:

  • 它有什么未定义的? o_O
  • 哪个编译器不接受?
  • 那么,您的意思是“是的,它是合法的”?为什么你会用另一个问题来回答一个问题?

标签: c gcc syntax


【解决方案1】:

这是完全合法的。如果a 等于b,则c 为1。否则为0。

【讨论】:

  • 如果a 等于b,那么c 可以是任何非零值,对吧?
  • @Teh:不,它必须是 1。(C99 §6.5.9/3 这么说。)
  • 我不确定,但我认为它必须是 1。(任何非零数字都表示正确,但比较运算符只返回 0 或 1)编辑:我在看到 KennyTM 的评论之前写了这个.
【解决方案2】:
int c = (a == b);

这是完全合法的。初始化是 C 标准的一部分(C99 §6.7.8),右侧可以是任何赋值表达式,包括a == b(当然,假设ab已定义并具有可比较的类型)。

【讨论】:

    【解决方案3】:

    如果c 在块范围内声明是完全有效的。

    在文件范围内声明时无效,因为初始化程序必须是常量表达式。

    a == b 是一个表达式,在这个意义上与另一个表达式(如 a + ba & b)没有什么不同。

    【讨论】:

      【解决方案4】:

      嗯,这取决于ab 的类型。如果它们是支持相等检查的类型,那么是的,这是完全合法的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-15
        • 1970-01-01
        • 2022-01-19
        • 2021-05-10
        • 2018-11-02
        • 2014-11-29
        • 1970-01-01
        相关资源
        最近更新 更多