通常在C中,我们将语句作为列表,当程序运行时,它逐个执行语句.是否可以同时执行两个语句?
例如,假设我希望交换两个变量a和b.通常我们会声明第三个变量c.
c=b;
b=a;
a=b;
Run Code Online (Sandbox Code Playgroud)
但是如果我们能够同时执行两个语句,那么我们就不需要第三个变量c.我们可以做a=b;,并b=a;同时代替.
那么,有没有办法同时执行两个或多个语句?
声明"当程序运行时,它逐个执行语句"表明你从根本上误解了C编程语言.
C标准说需要执行编译的程序,以便程序的 副作用按顺序发生,好像这些语句是根据抽象机的规则在C抽象机中执行的.但是,为非volatile变量赋值不会算作这样的副作用,即在程序中
c = b;
b = a;
a = c; // notice, it is *c* here
Run Code Online (Sandbox Code Playgroud)
由于没有任何语句具有任何可见副作用,因此编译器可以自由地重新组织,交错和消除这些语句,只要它不会改变任何先前或后续的副作用或它们的相对排序.
在实践中,任何体面的编译器都会注意到这是一个交换操作,并且它将使用一个汇编操作码对其进行编码,例如x86,XCHG即使C编程语言本身没有交换操作.或者,它们可能会产生零操作码,编译器只记得"以后b应该被称为a和a" b.
实际强制编译器生成将严格按顺序执行每个语句的程序的唯一方法是,如果每个语句都触及一个volatile限定的变量,因为访问一个volatile限定对象被认为是副作用.