C程序的输出| 28套
预测以下 C 程序的输出。
问题 1
#include
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 位小端机器上打印 -80。
char d = 1200;
printf ("%d ", d);
原程序中没有发生算术溢出,程序的输出为120。在C中, char和short被转换为int进行算术计算。所以在表达式 '(a*b)/c' 中,a、b 和 c 被提升为int并且不会发生溢出。
问题2
#include
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
int main()
{
int a, b = 10;
a = b---;
printf("a = %d, b = %d", a, b);
return 0;
}