C语言规范(n3096,6.7.3.1/8)给出了以下示例

示例2以下示例中的函数参数声明

void f(int n, int * restrict p, int * restrict q)
{
  while (n-- > 0)
    *p++ = *q++;
}

断言,在函数的每次执行过程中,如果通过指针之一访问对象, 参数,则它也不能通过其他访问.翻译器可以使这种无锯齿 仅基于参数声明进行推理,而不分析函数体.

翻译器如何仅根据参数声明来推断这一点呢?

例如,请允许我修改此示例,保留参数声明,如下所示.

int sum;
void f(int n, int * restrict p, int * restrict q)
{
  while (n-- > 0)
    sum += *p++ + *q++;
}

我认为现在允许通过pq访问同一个对象,因为这个对象不再被修改.(事实上,这似乎是条例草案第10条下一个例子3的要点.).

例5、例6和例7(第13、14、15条)加深了我的困惑.解决我困惑的一种方法是修改第8条中的案文,

"...如果对象被modified and访问..."

以及在随后的实施例中的类似变化.但对我来说,这似乎改变了语义.

推荐答案

这是例子中的一个错误.声明不是断言"如果通过一个指针参数访问对象",而是"如果一个对象通过一个指针参数访问并在函数执行期间被修改".

C++相关问答推荐

C中出现分段错误后关闭文件

以前版本的tty_ldisc_ops.ioctl()是否也需要文件参数?

C是否用0填充多维数组的其余部分?

自定义变参数函数的C预处置宏和警告 suppress ?

C中函数类型的前向声明

struct -未知大小

我怎么才能用GCC编译一个c库,让它包含另一个库呢?

什么是.c.h文件?

getline()从c中的外部函数传递指针时输出null

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

将多项式从文件.txt加载到终端时出现问题

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

将 struct 数组写入二进制文件时发生Valgrind错误

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

有没有办法减少C语言中线程的堆大小?

向左移位3如何得到以字节为单位的位数?

如何在C中处理流水线中的a、n命令?

C: NULL>;NULL总是false?

指向返回 struct 成员的指针,安全吗?

尽管将其标记为易失性,但 gcc 是否优化了我的等待代码?