预测以下C程序的输出。
null
问题1
#include <stdio.h> int main() { char a = 30; char b = 40; char c = 10; char d = (a * b) / c; printf ( "%d " , d); return 0; } |
乍一看,表达式(a*b)/c似乎会导致算术溢出,因为有符号字符的值只能从-128到127(在大多数c编译器中),而子表达式(a*b)的值是1200。例如,下面的代码片段在32位little endian机器上打印-80。
char d = 1200; printf ("%d ", d);
原始程序中不会发生算术溢出,程序的输出为120。在C中, 烧焦 和 短的 转化为 智力 用于算术计算。所以在表达式(a*b)/c中,a、b和c被提升为 智力 而且不会发生溢出。
问题2
#include<stdio.h> int main() { int a, b = 10; a = -b--; printf ( "a = %d, b = %d" , a, b); return 0; } |
输出:
a = -10, b = 9
语句“a=-b–;”编译得很好。一元减号和一元减量具有保存优先级和从右到左的关联性。因此“-b-”被视为有效的-(b-)。所以-10将被分配给“a”,而“b”将变成9。 尝试以下程序作为练习。
#include<stdio.h> int main() { int a, b = 10; a = b---; printf ( "a = %d, b = %d" , a, b); return 0; } |
如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END