此程序打印6
。
如果我取消注释//printf("yes");
行,则会打印8
但不会yes
。
如果我删除第一个i++;
并将该行留空,则会打印7
。
如果我删除第二个i++;
,则会打印5
。
似乎无法找到它。
int main ( ) {
int i = 3;
if (!i)
i++;
i++;
if (i==3)
//printf("yes");
i+=2;
i+=2;
printf("%d", i);
return 0;
}
答案 0 :(得分:6)
这个程序打印6,由于误导性缩进很难得到。
它目前相当于:
int main ( ) {
int i = 3;
if (!i)
{
i++;
}
i++; // this is executed whatever the previous if
if (i==3)
//printf("yes");
{
i+=2; // could be executed because printf was commented, but isn't because of the value of i
}
i+=2; // executed whatever the previous if
printf("%d", i);
return 0;
}
第二个条件:如果您将printf
注释掉,那么您将执行最后一个i+=2;
,否则您将执行两个i += 2
语句。
因此执行了2次添加:一次添加1,一次添加2.
3 + 1 + 2 = 6
请注意,gcc -Wall
会对这些案例产生奇迹(更准确地说是-Wmisleading-indentation
)。在你的代码上:
test.c: In function 'main':
test.c:6:1: warning: this 'if' clause does not guard... [-Wmisleading-indentatio
n]
if (!i)
^~
test.c:8:5: note: ...this statement, but the latter is misleadingly indented as
if it is guarded by the 'if'
i++;
^
test.c:10:1: warning: this 'if' clause does not guard... [-Wmisleading-indentati
on]
if (i==3)
^~
test.c:13:5: note: ...this statement, but the latter is misleadingly indented as
if it is guarded by the 'if'
i+=2;
^
作为结论:即使只有一条指令,也要用花括号来保护你的条件。这可以保护您免受:
do {} while(0)
模式的宏:只有宏中的第一条指令由if
答案 1 :(得分:2)
因为在'if'语句后面没有花括号,所以只有它后面的行才是有条件的。缩进什么也没做!
选项1答案= 6:
int main ( )
{
int i = 3; //i==3
if (!i) i++; // !3 = False Never Executed
i++; // i==4
if (i==3) printf("yes"); // i!=3 Never Executed
i+=2; // i==6
i+=2; // i==8
printf("%d", i);
return 0;
}
选项1答案= 8:
UPDATE
答案 2 :(得分:2)
我相信您的困惑是因为C允许您将大括号从if
语句中删除,但只有紧随其后的语句才会计入if
块内。
if (!i)
i++;
i++;
这与此相同。
if (!i) {
i++;
}
i++;
如果你来自Ruby或Python,缩进是语法,这可能会非常混乱。
虽然关闭括号可能很方便,但它也是引入错误的好方法。切勿使用此功能。