在C中增加求值后的变量

在C中增加求值后的变量,c,C,代码1: 产出:1234 代码2: i = 0; while ( arr[i++] != EOF ) printf("%d", i); 输出:01 2 3 在上面的代码中,arr[]=“//\n\0” 但是,我假设I++应该首先分配I和increment,对吗 i、 e 那么,代码1中到底发生了什么,以及为什么它的行为与代码2不同呢?好的,在代码中,您在递增后打印i 循环条件之后,i立即递增并变为1。打印时,i已递增。这就是为什么与代码2相比,它的打印方式有所不同 当您执行此操作时,

代码1:

产出:1234

代码2:

i = 0;
while ( arr[i++] != EOF )
     printf("%d", i);
输出:01 2 3

在上面的代码中,
arr[]=“//\n\0”

但是,我假设I++应该首先分配I和increment,对吗

i、 e


那么,代码1中到底发生了什么,以及为什么它的行为与代码2不同呢?

好的,在代码中,您在递增后打印
i


循环条件之后,
i
立即递增并变为1。打印时,
i
已递增。这就是为什么与代码2相比,它的打印方式有所不同

当您执行此操作时,会增加
i
,因此当您要打印它时,它当然会增加

而是打印出数组元素,这样您就知道得到了正确的数组元素:

if i = 1
j = i++
j = 1 (Not 2)

…也许我没抓住你提问的重点,但是:

那么,代码1中到底发生了什么,为什么它的行为不像代码2?

点击
i++
后,它将递增并将新值保存到
i
中。因此:

i = 0;
char c;
while ( (c = arr[i++]) != EOF )
     printf("%c", c);

如果您询问的是
i++
vs
++i
执行增量(前或后)后的行,则会存储新值。因此,在第一种情况下,增量是在while检查期间完成的,因此它保存在该点

有趣的是,语言的创造者竟然不知道这样一件基本的事情。这可能是因为当你死后,你的大脑停止工作了吗?;)@这是邪恶的:PSorry,对于那些不熟悉它的人来说,dennisritchie是C语言的两个“发明者”之一。布莱恩·克尼汉是另一个。发明家丹尼斯于2011年去世。显然,这个问题的作者要么是丹尼斯从另一个角度说话(只是在欺骗我们),要么就是碰巧这么称呼自己(或者是用户的真名!)对不起,如果这有点低级趣味的话……我是鬼。。我死后当然忘了所有的C
i = 0;
char c;
while ( (c = arr[i++]) != EOF )
     printf("%c", c);
i = 0;                     // i = 0
while ( arr[i++] != EOF )  // i = 1, 2, etc now before the print
     printf("%d", i);      // the incremented i is printed

i = 0;                     // i = 0
while ( arr[i] != EOF )  
{
      printf("%d", i);     // i still = 0 and that's printed
      i++;                 // now i = 1, 2, etc
}