猿问

C中调用函数之前的参数求值顺序

C中调用函数之前的参数求值顺序

在C中调用函数参数时,可以假定函数参数的赋值顺序吗?根据下面的程序,当我执行它时,似乎没有一个特定的命令。

#include <stdio.h>int main(){
   int a[] = {1, 2, 3};
   int * pa; 

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa), *(pa++),*(++pa));
   /* Result: a[0] = 3  a[1] = 2    a[2] = 2 */

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(pa),*(++pa));
   /* Result: a[0] = 2  a[1] = 2     a[2] = 2 */

   pa = &a[0];
   printf("a[0] = %d\ta[1] = %d\ta[2] = %d\n",*(pa++),*(++pa), *(pa));
   /* a[0] = 2  a[1] = 2 a[2] = 1 */}


手掌心
浏览 573回答 3
3回答

www说

不,函数参数在C中没有按定义的顺序计算。见马丁·约克对c+程序员应该知道的所有常见的未定义行为是什么?.

慕虎7371278

函数参数的计算顺序未指定,参见C99§6.5.2.2p10:函数指示符、实际参数中的实际参数和子表达式的计算顺序未指定,但在实际调用之前有一个序列点。C89中也有类似的措辞。此外,您正在修改pa多次没有调用未定义行为的序列点(逗号运算符引入序列点,但分隔函数参数的逗号不引入)。如果您打开编译器上的警告,它应该警告您:$&nbsp;gcc&nbsp;-Wall&nbsp;-W&nbsp;-ansi&nbsp;-pedantic&nbsp;test.c&nbsp;-o&nbsp;test test.c:&nbsp;In&nbsp;function&nbsp;‘main’:test.c:9:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:9:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:13:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:13:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:17:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:17:&nbsp;warning:&nbsp;operation&nbsp;on&nbsp;‘pa’&nbsp;may&nbsp;be&nbsp;undefined test.c:20:&nbsp;warning:&nbsp;control&nbsp;reaches&nbsp;end&nbsp;of&nbsp;non-void&nbsp;function

斯蒂芬大帝

只是为了增加一些经验。以下代码:int&nbsp;i=1;printf("%d&nbsp;%d&nbsp;%d\n",&nbsp;i++,&nbsp;i++,&nbsp;i);结果2 1 3-在Linux.i 686上使用g+4.2.11 2 3-在Linux.i 686上使用SunStudio C+5.92 1 3-在SunOS.x86pc上使用g+4.2.11 2 3-在SunOS.x86pc上使用SunStudio C+5.91 2 3-在SunOS.sun4u上使用g+4.2.11 2 3-在SunOS.sun4u上使用SunStudio C+5.9
随时随地看视频慕课网APP
我要回答