新人求助运算符
5.设有语句int a=4;则执行了语句a+=a-=a*a后,变量a的值是()A)-24 B)0 C)4 D)16
想知道用c语言的代码怎么写以及他计算的逻辑谢谢!
你能帮帮我吗? 答案是-24
#include<stdio.h>
int main(){
int a=4;
a+=a-=a*a;
printf("%d",a);
}
补充一下a-=a*a;的值为-12,a+=a即为-12+-12=-24 unsequenced modification and access to 'a'
这个是什么意思呢?
意思就是说,标准没有说这个表达式的值是什么,编译器的作者就随便整吧
就是这样
我这边的这个编译器是这样整的,你那边的编译器有可能不是这样整的
int main(void) {
1139: 55 pushq%rbp
113a: 48 89 e5 movq %rsp,%rbp
113d: 48 83 ec 10 subq $0x10,%rsp
int a = 4;
1141: c7 45 fc 04 00 00 00 movl $0x4,-0x4(%rbp)
a += a -= a * a;
1148: 8b 45 fc movl -0x4(%rbp),%eax
114b: 0f af c0 imull%eax,%eax
114e: 29 45 fc subl %eax,-0x4(%rbp)
1151: 8b 45 fc movl -0x4(%rbp),%eax
1154: 01 45 fc addl %eax,-0x4(%rbp)
printf("%d\n", a);
1157: 8b 45 fc movl -0x4(%rbp),%eax
115a: 89 c6 movl %eax,%esi
115c: 48 8d 05 a1 0e 00 00 leaq 0xea1(%rip),%rax # 2004 <_IO_stdin_used+0x4>
1163: 48 89 c7 movq %rax,%rdi
1166: b8 00 00 00 00 movl $0x0,%eax
116b: e8 c0 fe ff ff callq1030 <printf@plt>
return 0;
1170: b8 00 00 00 00 movl $0x0,%eax
}
1175: c9 leaveq
1176: c3 retq
这种题的主要作用就是告诉你,实操时尽量避免这样写 -24
先算a-=a*a➡️a = a - a * a➡️a = -12
再算a += -12➡️a = a + (-12)➡️a = -24 就是c语言程序运行的时候是按从右向左 本帖最后由 高山 于 2022-11-4 20:20 编辑
#include<iostream>
using namespace std;
int main(){
int n=4;
n+=n-=n*n;
cout<<n<<endl;
return 0;
}
实际运行效果:
答案是-24
能不能设置最佳答案?
页:
[1]