Is there ANY chance we can fix the bitwise operator precedence rules?

Adam Ruppe destructionator at gmail.com
Mon Jun 21 21:27:14 PDT 2010


On 6/22/10, Don <nospam at nospam.com> wrote:
> Did you consider situations where the last thing before the case is
> actually a 'goto' ? Walter does that a lot.

Yeah, me too. I counted them the same as break (and continue, return,
and throw).

Here's my source. I know it has some false negatives and some false
positives, which is why I rounded so vigorously.

=======
import std.string;
import std.stdio;

void main(string[] args) {
	int totalSwitchCount, totalFallthroughCount, totalCaseCount,
totalCaseFallthroughCount;
	foreach(arg; args[1..$]) {
		auto f = File(arg);
		int fallthroughCount = 0;
		int switchCount = 0;
		bool caseAlreadyOpen;
		bool fallthroughAlready;
		int caseCount = 0;
		int caseFallthroughCount;

		string lastLine;
		try
		foreach(line; f.byLine) {
			// if it says "case .*:", but not goto, we'll call it a switch case
			if(line.indexOf("case ") != -1 && line.indexOf("goto") == -1 &&
line.indexOf(":") != -1) {
				caseCount++;
				totalCaseCount++;
				if(caseAlreadyOpen) { // the first one doesn't count
					if(
					// If this line, or the last line (with a semicolon) breaks, it
isn't fallthrough
					lastLine.indexOf("break") == -1 && line.indexOf("break") == -1 &&
					// ditto for goto, continue, and return
					lastLine.indexOf("goto") == -1 && line.indexOf("goto") == -1 &&
					lastLine.indexOf("continue") == -1 && line.indexOf("continue") == -1 &&
					lastLine.indexOf("return") == -1 && line.indexOf("return") == -1 &&
					// and of course, exceptions
					lastLine.indexOf("throw") == -1 && line.indexOf("throw") == -1
					) {
						totalCaseFallthroughCount++;
						caseFallthroughCount++;
						if(!fallthroughAlready) {
							fallthroughCount++;
							totalFallthroughCount++;
						}
						fallthroughAlready = true;
					}
				} else
					caseAlreadyOpen = true;
			}
			if(line.indexOf("switch") != -1) {
				totalSwitchCount++;
				switchCount++;
				caseAlreadyOpen = false;
				fallthroughAlready = false;
			}
			if(line.indexOf(";") != -1) // only consider lines with semicolons
as a crude way to find non-empty cases and ignore whitespace
				lastLine = line.idup;
		}
		catch(Exception e) { } // i don't care

		writefln("%s: %d/%d (%d/%d cases)", arg, fallthroughCount,
switchCount, caseFallthroughCount, caseCount);
	}

	writefln("Total switches: %d/%d (%.1f%%)", totalFallthroughCount,
totalSwitchCount, cast(float) totalFallthroughCount / totalSwitchCount
* 100);
	writefln("   Total cases: %d/%d (%.1f%%)", totalCaseFallthroughCount,
totalCaseCount, cast(float) totalCaseFallthroughCount / totalCaseCount
* 100);
}
=======


I used the try without {} there too, which was mentioned in another
thread. I do this often; it never even occurred to me that it wouldn't
be allowed. It isn't for if and for, etc, so why would it be for try?
I love it.


More information about the Digitalmars-d mailing list