2. Write a function called year2016 that returns a row-vector of struct-s whose elements correspond to the days of a month in 2016 as specified by the input argument. If the input is not an integer between 1 and 12, the function returns the empty arr

1 次查看(过去 30 天)
Please explain to me why this code will not work.
function[d] = year2016(m)
if m<1 || m>12 || ~isscalar(m)|| m~=fix(m)
d = [];
else days = datenum([2016,m,1]):datenum([2016,m+1,1])-1;
date = 1 + mod(days-3,7);
month = {'January', 'february','March', 'April', 'May', 'June', 'July','August', 'September','October', 'November', 'December'};
day = {'Mon', 'Tue', 'Wed','Thu', 'Fri','Sat'};
x = day(date);
y = num2cell(1:numel(days));
z = month(m);
d = struct('day',x, 'date',y,'month',z);
end
  9 个评论
Steven Lord
Steven Lord 2019-1-4
In this case, order matters due to the short circuiting behavior of the || operator.
m = [1 2];
This section of code will error. The expression "m < 1" returns a vector not a scalar, and the || operator requires the two values with which it's computing to be scalar.
if m < 1 || ~isscalar(m)
disp('wrong!')
end
This section of code will work and will display 'wrong!'. The expression "~isscalar(m)" returns true, which is a logical scalar value. Since "true or <something else>" is true, MATLAB doesn't need to evaluate the second part of the expression. Therefore the fact that "m < 1" would have returned a non-scalar when evaluated doesn't matter. It doesn't get that far.
if ~isscalar(m) || m < 1
disp('wrong!')
end
If m were a scalar, "~isscalar(m)" would be false. Now MATLAB isn't sure whether the expression should be true or false based solely on the first expression's value, so it has to continue on to the second expression. But now we're guaranteed that "m < 1" returns a scalar which || can handle.

请先登录,再进行评论。

采纳的回答

Jan
Jan 2019-1-4
If m is not a scalar, the comparison:
if m<1 || m>12 ...
fails, because the || operator can be applied to scalars only. Move the check for scalar inputs to the front:
if ~isscalar(m) || m<1 || m>12 || m~=fix(m)
Now the first condition is true for a non-scalar input already and the rest of the condition is not evaluated anymore.

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Elementary Polygons 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by