📜  C程序的输出| 28套

📅  最后修改于: 2022-05-13 01:56:10.955000             🧑  作者: Mango

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中, charshort被转换为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;
}