我不明白正在打印的结果

时间:2018-06-05 08:32:23

标签: c

此程序打印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;
}

3 个答案:

答案 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;
     ^

作为结论:即使只有一条指令,也要用花括号来保护你的条件。这可以保护您免受:

  • 之后添加的代码,可能由其他人添加,意图在条件中添加但失败。
  • 定义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,缩进是语法,这可能会非常混乱。

虽然关闭括号可能很方便,但它也是引入错误的好方法。切勿使用此功能。