【问题标题】:what does this loop means: for(j,0,np) [closed]这个循环是什么意思:for(j,0,np) [关闭]
【发布时间】:2017-08-18 10:15:32
【问题描述】:
inline string search_prod(string p) //returns a concatenated string of variables which can produce string p
    {
        int j,k;
        string r="";
        for(j,0,np)
        {
            k=1;
            while(gram[j][k] != "")
            {
                if(gram[j][k] == p)
                {
                    r=concat(r,gram[j][0]);
                }
                k++;
            }
        }   
        return r;
    }

我以前从未见过这个循环。

【问题讨论】:

  • 它没有任何意义,它不是有效的语法。这可能是一个错字,使用逗号, 而不是分号;
  • 在你的代码中搜索相关的宏定义
  • 或者它是@CinCout 提到的宏(fornp)。在这种情况下,你应该尽快扔掉代码,并且永远不要再看那个作者的任何东西。
  • 只是为了把它混在一起:C!= C++。选择一个(可能是 C++)。无论如何,由于您没有提供minimal reproducible example,因此无法回答此问题。最大的问题是:np 是什么?
  • 这不是有效的 C++:“如果程序在保留名称的上下文中声明或定义名称,除非本条款明确允许,否则它的行为是未定义的。[... ] 翻译单元不得#define 或#undef 名称在词法上与关键字相同”。 (17.6.4.3)

标签: c++ loops for-loop


【解决方案1】:

好的。感谢@AshishJohn,这个问题现在可以解决了。

在提供的link 中,您可以在开头看到一个定义,它改变了 for 循环的语法:

#define for(i,a,b) for(i=a;i<b; i++)

所以for(j,0,np) 将被预处理器转换为:

for (j=0; j<np; j++)

这是一个正常的for循环。 np 也在文件中声明,只是一个全局整数变量。


但是,正如@molbdnilo 正确指出的那样,标准 (N4296) 禁止声明覆盖现有关键字的宏:

17.6.4.3.1 宏名称

  1. 包含标准库头文件的翻译单元不得在任何标准库头文件中声明#define 或#undef 名称。

  2. 翻译单元不得在词汇上与关键字、表 2 中列出的标识符或 7.6 中描述的属性标记相同的 #define 或 #undef 名称

因此,它的行为可能会或可能不会像我描述的那样。

【讨论】:

  • 不幸的是,对于想出那个可憎的聪明人来说,它是未定义的,可能会或可能不会扩展到任何东西。
  • 未定义的行为不需要诊断。它甚至可能不时表现出您所期望的方式。
  • 我认为这很好地解释了作者的意思,只是遗漏了一个说明这样做是不正确的。
猜你喜欢
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 2019-01-07
  • 2022-01-23
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多