编译器将如何解释“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) {
}
我有一份家庭作业,我认为教授打错了字,输入的是 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) {
}