相关疑难解决方法(0)

在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] = …
Run Code Online (Sandbox Code Playgroud)

c parameters evaluation

67
推荐指数
5
解决办法
4万
查看次数

C:当GCC从右到左评估时,为什么LLVM从左到右评估printf?

如此问题中所述:LLVM和GCC,不同的输出相同代码,LLVM和GCC导致相同代码的输出不同.

#include <stdio.h>

#define MAX(a,b) ( (a) > (b) ? (a) : (b) )

int increment() {
    static int i = 42;
    i += 5;
    printf("increment returns %d\n",i);
    return i;
}

int main( int argc, char ** argv ) {
    int x = 50;
    printf("max of %d and %d is %d\n", x,increment(),MAX(x, increment()));
    printf("max of %d and %d is %d\n", x,increment(),MAX(x, increment()));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

LLVM输出给出:

increment returns 47
increment returns 52
increment returns 57
max of 50 …
Run Code Online (Sandbox Code Playgroud)

c printf gcc clang operator-precedence

3
推荐指数
1
解决办法
427
查看次数

标签 统计

c ×2

clang ×1

evaluation ×1

gcc ×1

operator-precedence ×1

parameters ×1

printf ×1