编译器将如何解释“if(!(a=10))”?

How would a compiler interpret `if(!(a=10))`?

我有一份家庭作业,我认为教授打错了字,输入的是 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) 为什么该程序允许您永远继续输入条目?

谢谢!

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

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

对于 10 !a 的值将是 0 并且它永远不会中断 while 循环。 在此特定示例中,如果您分配 if(!(a=0)),则它将退出循环;

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

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

5 The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. The expression !E is equivalent to (0==E).

所以根据引用if语句

if (!(a=10)) {

相当于

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

作为赋值子表达式的值,a = 10 等于 10 即它不等于 0 那么 if 语句的条件计算为逻辑false 和 if 语句的子语句将得不到控制权,你将有一个无限的 while 循环。

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

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

以下方式效果相同

  while ( ( a = 10 ) ) {}

或者只是

  while ( ( a = 10 ) );

或更简单地说:

while ( a != 0 );

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

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

因为 !(a = 10) 始终为零(假)它等同于:

      while (1) {
      }