在C语言中可以同时执行两条语句吗?

在C语言中可以同时执行两条语句吗?,c,swap,C,Swap,通常在C语言中,我们将语句作为一个列表进行排序,当程序运行时,它会逐个执行这些语句。可以同时执行两条语句吗 例如,假设我希望交换两个变量a和b。通常我们会声明第三个变量c c=b; b=a; a=b; 但是如果我们能够同时执行两条语句,那么就不需要第三个变量c。我们可以做a=b和b=a同时进行 那么,有没有一种方法可以同时执行两个或多个语句呢?您可以在C中创建多个线程(使用libpthreads),如果您有一个多核CPU,那么这些线程可以同时执行 您的示例的问题在于数据相互依赖。您将创建一个

通常在C语言中,我们将语句作为一个列表进行排序,当程序运行时,它会逐个执行这些语句。可以同时执行两条语句吗

例如,假设我希望交换两个变量
a
b
。通常我们会声明第三个变量
c

c=b;
b=a;
a=b;
但是如果我们能够同时执行两条语句,那么就不需要第三个变量
c
。我们可以做
a=b
b=a同时进行


那么,有没有一种方法可以同时执行两个或多个语句呢?

您可以在C中创建多个线程(使用libpthreads),如果您有一个多核CPU,那么这些线程可以同时执行

您的示例的问题在于数据相互依赖。您将创建一个


如果要在不使用中间变量的情况下交换两个变量,可以使用,但其效率低于简单使用中间变量。

有多线程,但您所说的都是不可能的,因为这两个语句之间存在数据依赖关系

同时执行2将永远不会给出合理的结果

您可以做的是识别程序的不同独立部分,然后在不同的线程中执行它们。从程序员的角度来看,这就是可以达到的并行级别

那么,有没有一种方法可以同时执行两个或多个语句

是的,通过多线程

尽管如此,为了达到这个效果,您需要同时运行两个线程

一般来说,我们并不要求语句同时执行,这太难了,从中获得的收益根本不值得


然而,在您的情况下,它会导致数据竞争


PS:您可以在没有临时值的情况下交换数字,如我所述。

语句“当程序运行时,它会逐个执行语句”表明您从根本上误解了C编程语言

C标准规定,编译后的程序需要执行,以使程序的副作用按照抽象机器的规则以顺序执行这些语句。但是,将值赋给非
易失性
变量不会被视为副作用,即在您的程序中

c = b;
b = a;
a = c; // notice, it is *c* here
由于这些语句都没有任何明显的副作用,编译器可以自由地重新组织、交叉和消除这些语句,只要它不改变任何先前或之后的副作用或它们的相对顺序

在实践中,任何一个优秀的编译器都会注意到这是一个交换操作,它会使用一个汇编操作码对其进行编码,比如x86
XCHG
,即使C编程语言本身没有交换操作。或者,它们可能会生成操作码,编译器只会记住“从今以后
b
将被称为
a
a
将被称为
b


实际强制编译器生成严格顺序执行这些语句的程序的唯一方法是,如果每个语句都接触到
易失性
限定的变量,因为访问volatile限定对象被认为是一种副作用。

使用SIMD指令,如果数据合适,可以并行(矢量化)执行多条语句

例如:

a = e + g * ...
b = f + g * ...
c = e + g * ...
d = f + g * ...

无论您如何对其进行切片,CPU都必须将
b
的值保留在临时位置,然后才能被
a
覆盖,这样才能在分配回另一个变量时再次使用该值。甚至像Python这样允许你说
a,b=b,a
的语言也在暗中生成那些临时变量

有一些人在其他答案中提到“线程”。在这一点上,鉴于你所问问题的性质,我强烈建议你不要继续这样做。(您还没有为线程做好准备!)使用线程来进行简单的变量交换是非常不寻常的,并且只会在考虑更多竞争条件时变得更慢

如果您正在寻找一种表达“交换”的简写方式,您可以随时定义自己的宏

#define SWAP(x,y) {auto tmp=x; x=y; y=tmp;}

然后你可以说:
用你自己的代码交换(a,b)

c中的语句是按顺序执行的,除非你在代码中使用了break或continue标签。 特别是在您指定的示例中,不能同时执行语句。 如果不想使用临时变量,则可以使用此逻辑

a = a+b;
a = a-b;
b = a-b;

不,您不能同时交换这两个变量,因为只涉及两个内存位置,一个用于a,一个用于b。如果你认为CPU登记为中间-就像使用第三变量。例如,使用两个线程执行此操作是未定义的行为。您是否费心查看生成的程序集?编译器在识别互换和优化它们方面相当有效。不要过早地进行优化。只有当它们是
寄存器
变量,并且处理器有一条交换寄存器的指令时,我认为C不会这样做。AFAIK处理器没有内存交换指令。您可以使用,它不使用第三个变量,但效率不高,不能同时执行。FWIW英特尔x86系列有一条
XCHG
指令,可以在一次操作中交换两个整数。@PaulR是的,但它意味着锁定。因此,实际上很慢。线程将为OP要求的内容生成竞态条件。问题被标记为
c
,而不是
c++
,因此
auto
是否定的