Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C s[&x2B;&x2B;i]之间的差异;和s[i]++;我_C_Loops_For Loop_Post Increment_Pre Increment - Fatal编程技术网

C s[&x2B;&x2B;i]之间的差异;和s[i]++;我

C s[&x2B;&x2B;i]之间的差异;和s[i]++;我,c,loops,for-loop,post-increment,pre-increment,C,Loops,For Loop,Post Increment,Pre Increment,我正在做一些“C编程语言”的练习,不知道是什么给了我一定的输出。这并不是一个真正的障碍,因为我得到了我想要的输出,但我不明白为什么更改某段代码会给我想要的输出。我只是想找个解释 下面是我想要的代码。我不理解的部分是s[++I]=''在“k”for循环中。在我使用s[++I]之前,我使用了: s[i]='' ++i 这将只在数组中放置1个空间,无论k循环运行多少次 然后,为了测试,我放置了++I以上s[i]=''并且我的输出中没有一个空格 #include <stdio.h> #def

我正在做一些“C编程语言”的练习,不知道是什么给了我一定的输出。这并不是一个真正的障碍,因为我得到了我想要的输出,但我不明白为什么更改某段代码会给我想要的输出。我只是想找个解释

下面是我想要的代码。我不理解的部分是
s[++I]=''在“k”for循环中。在我使用
s[++I]
之前,我使用了:

s[i]=''

++i

这将只在数组中放置1个空间,无论k循环运行多少次

然后,为了测试,我放置了
++I以上
s[i]=''并且我的输出中没有一个空格

#include <stdio.h>
#define MAXLINE 1000
#define TABSTOP 5

/* Write a program "detab" that replaces tabs in the input with a proper
number of blanks to space to the next tab stop. Assume a fixed set of tab
stops, say every n columnns. Should n be a variable or a synbolic parameter? */


int main() {

  char c;
  int i, j;
  int modTabStop, numTabs, k;
  char s[MAXLINE];

  i = 0;
  while((c = getchar()) != EOF) {
    if(c == '\t') {
      modTabStop = i % TABSTOP;
      numTabs = TABSTOP - modTabStop;
      for(k = 0;k <= numTabs; ++k)
        s[++i] = ' ';
    }
    else if(c == '\n') {
      ;
    }
    else {
      s[i] = c;
      ++i;
    }
  }

  for(j = 0;j <= i;++j)
    printf("%c", s[j]);

  return 0;
}
#包括
#定义MAXLINE 1000
#定义止动块5
/*编写一个程序“detab”,将输入中的制表符替换为正确的制表符
到下一个制表位的空格数。假设一组固定的选项卡
停止,每n列说一次。n应该是变量还是合成参数*/
int main(){
字符c;
int i,j;
int modTabStop,numTabs,k;
字符s[MAXLINE];
i=0;
而((c=getchar())!=EOF){
如果(c=='\t'){
modTabStop=i%TABSTOP;
numTabs=TABSTOP-modTabStop;

对于(k=0;k而言,两者之间存在显著差异

s[i]
i++;

在解释之前,让我将第一个表单简化为
s[i++]
,这样您就可以

s[i++]

我相信这会让事情变得更清楚,这就是增量前和增量后的区别


不同之处在于,预增量
s[++i]
先将
i
的值递增,然后再将其注入到表达式中,在本例中,表达式是数组访问运算符。而增量后将i的值首先注入数组访问运算符,然后再递增,就像最初在展开的两行形式中所做的一样。

我们之间有一个主要区别嗯

s[i]
i++;

在解释之前,让我将第一个表单简化为
s[i++]
,这样您就可以

s[i++]

我相信这会让事情变得更清楚,这就是增量前和增量后的区别

不同之处在于,预增量
s[++i]
先将
i
的值递增,然后再将其注入到表达式中,在我们的例子中,表达式是数组访问运算符。而增量后将首先将i的值注入数组访问运算符,然后再将其递增,就像最初在展开的两行形式中所做的一样。

首先启动此循环

  for(k = 0;k <= numTabs; ++k)
              ^^^
while((c = getchar()) != EOF) {
也不正确,因为位置
i
处的字符未更改。由于预增量运算符
++i
而跳过该位置

你应该改写

    s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
最后,循环看起来是这样的

  for(k = 0;k < numTabs; ++k)
              ^^^
  for(k = 0;k < numTabs; ++k)
    s[i++] = ' ';
这是不正确的

你应该改写

    s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
否则,如果您输入多个语句,它们将不会分开

在第一种情况下,应删除该if声明

而不是宣言

char c;
int c;
你应该使用声明

char c;
int c;
因为类型char可以表现为类型unsigned char(取决于编译器选项)。在这种情况下,比较
c!=EOF
将始终为真。

对于初学者,此循环

  for(k = 0;k <= numTabs; ++k)
              ^^^
while((c = getchar()) != EOF) {
也不正确,因为位置
i
处的字符未更改。由于预增量运算符
++i
而跳过该位置

你应该改写

    s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
最后,循环看起来是这样的

  for(k = 0;k < numTabs; ++k)
              ^^^
  for(k = 0;k < numTabs; ++k)
    s[i++] = ' ';
这是不正确的

你应该改写

    s[i++] = ' ';
while( i < MAXLINE && ( c = getchar() ) != EOF && c != '\n' ) {
否则,如果您输入多个语句,它们将不会分开

在第一种情况下,应删除该if声明

而不是宣言

char c;
int c;
你应该使用声明

char c;
int c;
因为类型char可以表现为类型unsigned char(取决于编译器选项)。在这种情况下,比较
c!=EOF
将始终为真。

考虑以下代码:

for(k = 0;k <= numTabs; ++k)
    s[i] = ' ';
    ++i;
i
递增
numTabs
次,然后写入一个空格。这会在数组中留下
numTabs
字符,可能是一个终止NULL

解决方案很简单:使用大括号考虑以下代码:

for(k = 0;k <= numTabs; ++k)
    s[i] = ' ';
    ++i;
i
递增
numTabs
次,然后写入一个空格。这会在数组中留下
numTabs
字符,可能是一个终止NULL


解决方案很简单:使用大括号

谢谢你的快速回复!好的,前后增量都是有意义的。但是有什么原因导致两行形式不起作用而单行形式会起作用吗?这就是我最困惑的地方。比如
s[++i]
在我的代码中起作用,但两行形式给了我错误/不同的输出(1个空格vs 2个空格)如果要在预递增时使用两行形式,必须先执行
i=i+1
,然后使用it@ubernoob1010-在尝试双语句形式时,是否在循环体中包含大括号?此外,在使用双语句形式时,将数组的不同元素赋值Jonathan,没有忘记了大括号,现在发这个感觉真的很傻。我一直在胡闹,我想我完全忽略了这么简单的事情。谢谢你的帮助,很抱歉浪费了你的时间!谢谢你的超级快速回复!好的,前后增量是有意义的。但是有什么原因导致两行表格不能工作和单行形式会吗?这是我最困惑的地方。就像
s[++i]
在我的代码中工作一样,但是两行形式给了我错误的/不同的输出(1个空格vs 2个空格)。如果你想在预递增时使用两行形式,你必须先执行
i=i+1
,然后使用it@uberno