📜  C 程序的输出 |组5

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

C 程序的输出 |组5

预测以下程序的输出
问题 1

c
int main()
{
    while(1){
        if(printf("%d",printf("%d")))
            break;
        else
            continue;
    }
    return 0;
}


c
int main()
{
    unsigned int i=10;
    while(i-- >= 0)
        printf("%u ",i);
    return 0;
}


c
int main()
{
    int x,y=2,z,a;
    if ( x = y%2)
         z =2;
    a=2;
    printf("%d %d ",z,x);
    return 0;
}


c
int main()
{
    int a[10];
    printf("%d",*a+1-*a+3);
    return 0;
}


c
#define prod(a,b) a*b
int main()
{
    int x=3,y=4;
    printf("%d",prod(x+2,y-1));
    return 0;
}


输出:
无法预测
解释:
while 循环中的条件是 1,所以在第一次拍摄时它看起来是无限循环的。然后while循环体中有break和continue,所以可能不是无限循环。如果满足 if 下的条件,则执行 break 语句,否则将执行 continue。因为在 while 循环中 continue 之后没有其他语句,所以 continue 没有任何作用。事实上,这是无关紧要的。那么让我们看看if条件。如果我们仔细观察,我们会注意到 if 的条件总是会被满足,所以 break 会在第一次迭代时执行,我们就会退出 while 循环。满足 if 条件的原因是 printf函数。函数printf 总是返回编号。它有输出的字节数。比如printf(“geeks”)的返回值就是5,因为这里printf会输出5个字符。在我们的例子中,内部的 printf 将首先被执行,但这个 printf 没有格式说明符的参数,即 %d。这意味着这个 printf 将打印任意值。但请注意,即使对于任意值,也不是。内部 printf 输出的字节数将为非零。而那些没有。字节数将作为外部 printf 的参数。外部 printf 将打印那么多没有。字节并始终返回非零值。所以 if 的条件也始终为真。因此,while 循环只执行一次。作为旁注,即使没有外部 printf , if 的条件也始终为真。
问题2

C

int main()
{
    unsigned int i=10;
    while(i-- >= 0)
        printf("%u ",i);
    return 0;
}

输出:
9 8 7 6 5 4 3 2 1 0 4294967295 4294967294 ……(在 int 为 4 字节长的机器上)
9 8 7 6 5 4 3 2 1 0 65535 65534 .... (在 int 为 2 个字节长的机器上)
解释:
让我们检查一下 while 循环的条件。很明显只要满足while循环的条件,printf就会被执行。有两个运算符在while循环的条件:递减岗位运算符和比较运算符。从运算符优先级,我们知道,一元运算运算符后减量具有更高的优先级高于运算符。但由于后递减的特性,i 的值只有在用于比较后才会递减。所以在第一次迭代时,条件为真,因为 10>=0 然后 i 递减。因此将打印 9。类似地,循环继续并且 i 的值不断递减。让我们看看当while循环的条件变为0>=0时会发生什么。此时条件满足,i自减。由于 i 是无符号整数,因此发生翻转并且 i 取无符号 int 可以取的最高 +ve 值的值。所以我从不消极。因此,它变成了无限的 while 循环。
作为旁注,如果我被签名为 int,while 循环将在打印最高正值后终止
问题 3

C

int main()
{
    int x,y=2,z,a;
    if ( x = y%2)
         z =2;
    a=2;
    printf("%d %d ",z,x);
    return 0;
}

输出:
< z 的一些垃圾值 > 0
解释:
这个问题有一些关于运算符优先级的东西。如果满足 if 的条件,则 z 将被初始化为 2 否则 z 将包含垃圾值。但是 if 的条件有两个运算符:赋值运算符和取模运算符。模数的优先级高于赋值。所以 y%2 为零,它将被分配给 x。所以 x 的值变为零,这也是 if 的有效条件。因此,if 的条件为假。
问题 4

C

int main()
{
    int a[10];
    printf("%d",*a+1-*a+3);
    return 0;
}

输出:4
解释:
从运算符的优先级来看,解引用运算符的优先级高于加法/减法运算符。因此将首先应用取消引用。这里, a 是一个未初始化的数组。如果我们使用a,那么它将指向数组的第一个元素。因此 *a 将是数组的第一个元素。假设数组的第一个元素是 x,那么 printf 中的参数变为如下。它的有效值为 4。
x + 1 – x + 3 = 4
问题 5

C

#define prod(a,b) a*b
int main()
{
    int x=3,y=4;
    printf("%d",prod(x+2,y-1));
    return 0;
}

输出:
10
解释:
该程序处理宏、它们的副作用和运算符优先级。这里 prod 是一个宏,它将它的两个参数 a 和 b 相乘。让我们仔细看看。
prod(a, b) = a*b
prod(x+2, y-1) = x+2*y-1 = 3+2*4-1 = 3+8-1=10
如果程序员真的想将 x+2 和 y-1 相乘,他应该在 a 和 b 周围加上括号,如下所示。
prod(a,b) = (a)*(b)
宏定义中的这种错误称为-宏副作用。