An event control like @(…) or #(…) is a prefix to any single procedural statement. It is not considered a statement in itself.
The difference between
@(A) somecode;
and
@(A); somecode;
is that the first line is considered one procedural statement and the second line is considered two procedural statements. The first of the two statements in the second line is the null statement, prefixed by an event control @(A).
You might think there is really no behavioral difference between these two lines, but I haven’t shown you the complete context of where these statements are located (neither did you in your original question).
If you had
task t1;
@(A) somecode;
endtask
task t2;
@(A); somecode;
endtask
I can claim there is no behavioral difference between t1 and t2. However tools may differ in their ability to set breakpoints on individual statements, and code coverage tools may report these as one or two statements respectively.
On the there hand, if you had the following code
task t1;
if (X)
@(A) somecode;
endtask
task t2;
if (X)
@(A); somecode;
endtask
Now there is a big difference between the two tasks. In t1, the conditional statement is @(A) somecode;. But in t2, only @A; is the conditional statement-- somecode; is executed unconditionally. Of course, you can always wrap multiple statements in an begin/end block, and use that block where one statement is allowed.
task t1;
if (X)
@(A) somecode;
endtask
task t2;
if (X)
begin @(A); somecode; end
endtask
task t3;
if (X)
@(A) begin somecode; end
endtask
Now t1 and t2 are now behaviorally the same. t3 is also the same. the event control is a prefix to a single statement, which happens to be a begin/end block.