【问题标题】:How would a compiler interpret `if(!(a=10))`?编译器将如何解释 `if(!(a=10))`?
【发布时间】:2021-07-12 18:02:18
【问题描述】:

我有一个家庭作业,我相信教授打错了字,输入了if(!(a=10)) 而不是if(!(a==10))。然而,当被问及这是否是错字时,她告诉我“假设方程式是正确的并给出你的答案”。具体来说,赋值是描述程序的行为:

#include <stdio.h>

int main() {
      int a = 100;
      while (1) {
          if (!(a=10)) {
              break;
          } 
      }
      return 0; 
}

如果攻击性代码读取(!(a==10)),那么程序将进入if 循环,到达break 并退出这两个循环,这对于C 编程的初级课程来说是有意义的。

但是,如果代码确实是要读取(!(a=10)),那么我不知道编译器会解释它是什么意思。我知道代码可以编译,当你在 UNIX 中运行它时,它只允许你使用键盘输入任何你想要的东西,比如说数字“7”,然后你按下回车键,它会移动到一个新的行,你可以输入“dog”,然后移动到一个新的行,然后继续,它永远不会退出回命令行。那么(1)编译器将如何解释(!(a=10))?以及(2)为什么程序允许您永远继续输入条目?

谢谢!

【问题讨论】:

  • 输入的东西没有任何意义——Unix总是允许你输入东西并缓冲它,直到它稍后被读取。重要的是程序永远不会退出 - 它无限循环,因此您可以得出结论,break; 永远不会被占用。现在你必须弄清楚为什么不这样做。
  • 提示:a=10 是一个表达式并且有一个值。那价值是什么?仔细阅读= 运算符的工作原理。
  • !(a=10) 将始终为 false,在 C 中,除 0 之外的所有内容都被视为 true=10 分配给 a。因此,您可以将其视为!10,即false
  • 我怀疑是错字。这是一个技巧问题。
  • @1Teaches2Learn:不,请参阅下面的答案。

标签: c if-statement negation


【解决方案1】:

对于第一个问题, if( !(a=10) ){break;}是什么意思, 相当于

a = 10; if(!a) {break;}

对于10 的值,!a 将是0,它永远不会破坏while 循环。 在这个特定的例子中,如果你分配if(!(a=0)),那么它将退出循环;

对于第二个问题,您的示例中没有代码。 但是第一个问题的答案可以在这里扩展,因为循环永远不会中断,它会不断询问输入值。

【讨论】:

  • 谢谢。特别是,如果将赋值更改为if(!(a=0)),循环将到达break这一点对我的理解非常有帮助。
【解决方案2】:

来自 C 标准 (6.5.3.3 Unary arithmetic operators ¶5)

5 逻辑否定运算符! 的结果为 0,如果 它的操作数比较不等于0,如果它的操作数的值是1 比较等于 0。结果的类型为 int。表达式!E 是 相当于(0==E)

所以根据引用的 if 语句

if (!(a=10)) {

等价于

if ( ( a = 10 ) == 0 ) {

作为赋值子表达式的值,a = 10 等于10,即不等于0,则 if 语句的条件为逻辑假,而if 语句将无法获得控制权,您将有一个无限的 while 循环。

其实你可以重写这个while循环

  while (1) {
      if (!(a=10)) {
          break;
      } 
  }

以下方式效果相同

  while ( ( a = 10 ) ) {}

或者只是

  while ( ( a = 10 ) );

或更简单地说:

while ( a != 0 );

因为重要的是在while循环中变量a确实等于0。

【讨论】:

  • “5的结果”中的字符5是什么
  • @InQusitive 它是标准引用部分中的段落编号。:)
【解决方案3】:
      while (1) {
          if (!(a=10)) {
              break;
          } 
      }

因为!(a = 10) 总是零(假)它相当于:

      while (1) {
      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-11
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2018-10-02
    相关资源
    最近更新 更多