以下是代码:

int main(int argc, char *argv[ ]){
    int x = 33;
    if(!fork()){
        int x = 10;
        printf("%d\n", x);
    }
    fork();
    printf("%d\n", x);
    return 0;
}

我假设因为int的值为原始子变量而改变,所以它携带的值为10,在第二个fork(fork();)中也是如此(fork();),所以原始子变量及其子变量打印10,因此输出如下所示:33 10 10 10 但是看起来,虽然int的值在if内部发生了变化,但子函数随后会返回x的原始值,即33,并且在第二个fork之后,两个函数都打印33(所以输出是这样的:33 33 10 33 33.为什么?(我认为\n与此无关)here is a photo of what i think is happening but apparently it doesnt

推荐答案

打印在if块内的第一个printf中的x被定义为在}处结束的局部范围.第二个printf使用在main主体的范围内定义的仍具有初始值33x.

用与封闭作用域中定义的变量相同的方法重新定义局部作用域中的变量称为shadowing.它容易混淆且容易出错,如果您使用-Wall -Wextra-Weverything启用高级编译器警告,则会报告警告.

以下是一个修改后的版本,应该会产生更接近您预期的输出:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    int x = 33;
    if (!fork()) {
        x = 10;
        printf("%d\n", x);
    }
    fork();
    printf("%d\n", x);
    return 0;
}

此版本应以不可预测的顺序打印33两次和10三次.

问题中张贴的原始版本应该以不可预测的顺序打印33 4次和10一次.

C++相关问答推荐

C中出现分段错误后关闭文件

编译SDL 2时缺少SDL_ttf

C:二进制搜索和二进制插入

当execvp在C函数中失败时杀死子进程

ATmega328P EEPROM未写入

为什么STM32G474RE上没有启用RCC PLL

使用双指针动态分配和初始化2D数组

1处的解析器错误:yacc语法的语法错误

在句子中转换单词的问题

RawMotion的XInput2错误(具有较高值的XISelectEvents上的BadValue)

如何使用C++在控制台中以彩色打印被阻止的客户端

如何在C中使数组变量的值为常量?

如何在GDB中查看MUSL的源代码

S,在 struct 中创建匿名静态缓冲区的最佳方式是什么?

赋值两侧的后置增量,字符指针

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

可以对两种 struct 类型中的任何一种进行操作的C函数

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

10 个字节对于这个 C 程序返回后跳行的能力有什么意义

在带中断的循环缓冲区中使用 易失性