在C和C++代码中,特别是对于嵌入式系统,我经常偶然发现具有以下形状的赋值:
A |= B;
A &= B;
Run Code Online (Sandbox Code Playgroud)
不确定是否相关,但A和B是寄存器.请参阅此处的示例:http: //processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x#Example_Code 出现以下行:
IER |= 0x002;
IER &= 0x002;
Run Code Online (Sandbox Code Playgroud)
但是,这些后续分配似乎与单个分配相同
A = B;
Run Code Online (Sandbox Code Playgroud)
除了理论上,前者在某些情况下可以在两条线之间中断,但这似乎在大多数代码中都没有起到重要作用.
使用前者优于后者是否有优势,还是我看不到其他差异?
这有效(绘制一个“空”图):
function testme
plot(1)
Run Code Online (Sandbox Code Playgroud)
这有效(返回 1):
function testme
plot = @(x)x;
plot(1)
Run Code Online (Sandbox Code Playgroud)
这不会(错误:“未定义的函数或变量'绘图'。”):
function testme
if 0
plot = @(x)x;
end
plot(1)
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?为什么重写但不重新定义已定义的函数会使函数未定义?
注 1:这不是特定于内置函数的;以下代码返回相同的错误:
function testme
if 0
myfun = @(x)x;
end
myfun(1)
function x=myfun(x)
x=x*2;
Run Code Online (Sandbox Code Playgroud)
注2:错误发生在函数环境中,而不是脚本中;以下代码不会返回错误(并绘制与第一个示例中相同的空图):
if 0
plot = @(x)x;
end
plot(1)
Run Code Online (Sandbox Code Playgroud)
更新:对于感兴趣的读者,这里是我的原始问题的一些背景信息。上面的例子只是说明主要问题的最少工作示例(它们确实具有死胡同的 if 语句)。在实践中,我试图通过将这些函数覆盖为不存在的简化自定义函数来为没有某些库/工具箱函数的同事提供可用的函数,作为快速修复。特别是,它涉及 imdilate(和 imerode)。该函数如下所示:
Run Code Online (Sandbox Code Playgroud)function [myoutputs] = myfunction(myinputs) % if the images toolbox is not available, use the following simplified % replacement function if ~exist('imdilate','file') imdilate = @(IM,SE)vecdilate(IM,SE); end %% The original function goes …