Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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++ 在c语言中访问越界数组_C++_C - Fatal编程技术网

C++ 在c语言中访问越界数组

C++ 在c语言中访问越界数组,c++,c,C++,C,我见过一种特殊的代码风格,在我看来是危险的,应该避免使用,但我在很多地方都见过这种风格,以至于我对自己是否遗漏了什么感到困惑 int a[100]; /* Some code later */ for(i =0; (i < 100 && a[i] != 0); i++) : : 在上述代码中,表达式i

我见过一种特殊的代码风格,在我看来是危险的,应该避免使用,但我在很多地方都见过这种风格,以至于我对自己是否遗漏了什么感到困惑

int a[100];

/* Some code later */

for(i =0; (i < 100 && a[i] != 0); i++)
           :
           :

在上述代码中,表达式i<100&&a[i]!=0从右向左求值,在这种情况下,当i==100时,我们将超出数组“a”的边界

有人能解释一下这是否是安全代码吗?

我想当I<100为假时,你可以指望不访问[I]。

我想当I<100为假时,你可以指望不访问[I]。

我不可能<100&&a[I]!=0从右向左求值和| |被明确定义为首先计算它们的左参数,只有在必要时才计算它们的右参数。

i<100&&a[i]!=0从右向左求值和| |被明确定义为首先计算其左参数,只有在必要时才计算其右参数

&&的求值顺序或参数定义得很好,不能更改。 1再加上它,这是非常安全的。 参考资料:

C++03标准:

第5节:表述,第4段:

除非另有说明[例如&&和| |]的特殊规则],否则未指定单个运算符的操作数和单个表达式的子表达式的求值顺序以及产生副作用的顺序

C99标准:

第6.5节:

运算符和操作数的分组由语法指示。72除非稍后为函数调用、&&、| |、?:、和逗号运算符指定,否则子表达式的求值顺序和副作用发生的顺序均未指定

注:我的重点

&&的求值顺序或参数定义得很好,不能更改。 1再加上它,这是非常安全的。 参考资料:

C++03标准:

第5节:表述,第4段:

除非另有说明[例如&&和| |]的特殊规则],否则未指定单个运算符的操作数和单个表达式的子表达式的求值顺序以及产生副作用的顺序

C99标准:

第6.5节:

运算符和操作数的分组由语法指示。72除非稍后为函数调用、&&、| |、?:、和逗号运算符指定,否则子表达式的求值顺序和副作用发生的顺序均未指定


注:强调矿山。

和| |按每个人所说的从左到右进行评估。您可能需要考虑以下链接以获得进一步的信息


&&和| |按每个人所说的从左到右进行评估。您可能需要考虑以下链接以获得进一步的信息


在上述代码中,表达式i<100&&a[i]!=0从右向左求值

<>不可能,C和C++都不可能。在这两种语言中,该表达式保证从左到右求值。如果第一部分为假,则保证不评估第二部分


因此,代码是完全安全的,不会被越界访问。

在上述代码中,表达式i<100&&a[i]!=0从右向左求值

<>不可能,C和C++都不可能。在这两种语言中,该表达式保证从左到右求值。如果第一部分为假,则保证不评估第二部分


所以,代码完全不会越界访问。

为什么该表达式会从右到左求值?当i=100 right时,条件失败?当涉及到&&如果前半部分求值为false,则不会选中第二部分,因此它会从左到右求值。为什么该表达式会从右到左求值当i=100 right时,条件失败?当涉及到&&时,如果前半部分评估为false,则不检查第二部分,因此它从左到右进行评估