[英]evaluation of an expression in an if statement in c
假设我将代码写为:
int main()
{
int i,a=2147483647;
if((2*a)<0)
printf("hello");
else
printf("world");
}
输出就是世界。 但对于 :
int main()
{
int i,a=2147483647;
if((a+a)<0)
printf("hello");
else
printf("world");
}
输出是hello
。
这是怎么回事?
内存中存储的2 * a和a + a的值在哪里(存储位置的数据类型是什么?)
如果您的INT_MAX
为2147483647
( pow(2, 31) - 1
INT_MAX
pow(2, 31) - 1
),则2*a
和a+a
确实会导致溢出,并且有符号整数算术溢出是C中的未定义行为 。
引用N1256 6.5表达式:
5如果在表达式的求值过程中发生异常情况 (即,如果未在数学上定义结果或该结果不在其类型的可表示值范围内),则该行为不确定。
未定义的行为会导致一切 。 查看编译器的输出以了解产生此特定结果的原因。
要知道2*a
和a+a
的值存储在哪里,还请参见编译器的输出。 我想如果您的编译器足够聪明,它们应该存储在寄存器中,而不是内存中。 一些性能差的编译器可能会将其值存储在内存中的堆栈中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.