[英]What is the result of while(i=20) or any number in general in a C program?
在某个地方遇到了这个问题-
以下程序的输出是什么
int main(void) {
int i = 10 ;
while ( i = 20 )
printf ( "\nA computer buff!" ) ;
return 0;
}
现在我知道在C语言中每个非零数字都被视为true,但是我还无法弄清楚while内使用赋值运算符的结果。 当我运行代码“计算机迷”时,循环中打印的次数未知。 我知道这是一个愚蠢的问题,但仍然存在疑问。
那应该是一个无限循环,因为赋值表达式的结果是i = 20
将产生20。
来自文档
赋值操作将右操作数的值分配给左操作数命名的存储位置。 因此,赋值操作的左侧操作数必须是可修改的l值。 赋值后,赋值表达式具有左操作数的值,但不是l值。
在你的代码中
while ( i = 20 )
本质上是为i
分配20,然后将i
作为while
循环的条件检查。 由于循环体内没有break
条件,因此实际上是无限循环。
您可以使用gcc中的-S选项在* nix上轻松检查它。 我拿了这个文件:
#include <stdio.h>
main( ){
int i = 10 ;
while ( i == 20 )
printf ( "\nA computer buff!" );
}
用gcc -S test.c
,它给了我聪明的信息:
.file "c.c"
.section .rodata
.LC0:
.string "\nA computer buff!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $10, -4(%rbp)
nop
.L2:
movl $20, -4(%rbp)
movl $.LC0, %edi
movl $0, %eax
call printf
jmp .L2
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits
您可以在jmp .L2
看到这是唯一负责循环的分支,这是非决定性的。 movl $20, -4(%rbp)
是i的赋值20。
while(1)是无限循环,因此其执行次数。 如果要在第一次迭代后从循环中移出,请在循环中使用break语句。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.