【问题标题】:Unknown behaviour of assignment op in C [duplicate]C中赋值操作的未知行为[重复]
【发布时间】:2019-01-24 05:15:17
【问题描述】:

我不知道从这个构造返回真假的确切情况。你能描述一下吗?不好意思,如果是在谷歌搜索,我没有找到。

( (struct->param = param_init()) == NULL )

【问题讨论】:

  • 函数的返回值是 A) 存储在 struct->param 和 B) 与 NULL 的比较。
  • [1) 函数调用 --> 2) 赋值] - 由() 包裹,然后进行比较。
  • 你还没有找到任何C教材吗?即使是好的 ol' K&R 也会起作用。
  • @SouravGhosh:这里的运算符优先级不是问题,因为赋值是用括号括起来的。

标签: c boolean assignment-operator


【解决方案1】:

param_init() 将首先评估此语句,并将输出存储在struct->param 中。 如果struct->param 包含NULL,如果条件将被评估为true 或者如果struct->param 包含non NULL,如果条件将被评估为false

【讨论】:

  • 与 user3386109 的回答相同,ty :)
  • 更正:param_init() 不是声明。 “如果 struct->param 包含 NULL” - 不能保证赋值运算符读取 LHS 值或仅传递 RHS 值。对于volatile LHS,这可能会成为问题。而NULL 是一个宏,它甚至在运行时都不存在。正确有助于初学者理解这背后的规则。并不是说即使是以结构化方式学习语言的初学者也无法做到。
【解决方案2】:
if ( (struct1->param = param_init()) == NULL )

是一种混淆的书写方式

struct1->param = param_init();
if(struct1->param == NULL)
{
  ...
}

使用后一种形式,应避免在条件内赋值。

【讨论】:

  • 应避免在条件内赋值。请解释原因。这类似于说 应避免三元运算符,因为它是内联的。
  • @tilz0R 因为 1) 在不相关的表达式中存在副作用是一个坏主意,以及 2) 通常将尽可能多的运算符发送到单个表达式中是一个坏主意, 和 3) === 可以混用。
  • 3) 这就是为什么有经验的程序员写NULL == variable :)
  • @tilz0R 我认为你是指经验丰富的绝地武士? “尤达条件”早已过时。 1989 年,当 Borland 发布 TC 时,它们变得过时了 - 一个能够警告不要在内部条件中使用 = 的编译器。你会得到“可能不正确的分配”。
  • 这是我最后的评论。在您的链接中,兼容的解决方案包括:if ((a = b) == true),与发布的 OP 相同。所以第3点没有实际意义。
【解决方案3】:

由于赋值运算符的优先级最低,这就是它总是最后执行的原因,所以在第一个括号中,函数 param_init() 将首先被调用,该函数的返回值将被分配给结构指针 struct->param 并在struct->param 的最后一个值将与 0(NULL) 进行比较,结果(0 或 1)将返回。 注意:删除括号会改变结果,因为它会改变优先级。

【讨论】:

    猜你喜欢
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2011-03-12
    • 2019-03-11
    • 1970-01-01
    • 2019-12-05
    相关资源
    最近更新 更多