小编hac*_*cks的帖子

&& over ||的优先顺序

据我所知,逻辑运算符的&&优先级高于||.在运行代码时:

#include <stdio.h>

int main()
{
    int i = 1, j =1, k = 1;

    printf("%d\n",++i || ++j && ++k);
    printf("%d %d %d",i,j,k);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

给出输出:

1
2 1 1
Run Code Online (Sandbox Code Playgroud)

只有在这样++i || ++j && ++k评估时才有可能:

(++i) || (++j && ++k)
Run Code Online (Sandbox Code Playgroud)

但是,根据运算符优先级规则,它应该被评估为:

(++i || ++j) && (++k)
Run Code Online (Sandbox Code Playgroud)

因此输出应该是:

1
2 1 2
Run Code Online (Sandbox Code Playgroud)

这有什么问题?

注意:根据我的理解,我认为具有更高优先级的运算符如下评估(如果它是左关联的):
1.评估其左表达式
2.然后评估其正确的表达式(如果需要)

我错了吗?

c operators operator-precedence

10
推荐指数
3
解决办法
5097
查看次数

将矩阵作为函数中的参数传递

我一直在尝试编写一个函数,它给出了元素为0的行和列的索引.我尝试使用函数

void make_zero(int matrix[][],int row,int col)
{
    int row, col;
    int i,j;  

    for(i=0;i<row;i++)
    {
        for(j=0;j<col;j++)
        {
            if(matrix[i][j]==0){
                printf("%d %d\n", i, j);
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

但在编译时它会出现错误"错误:数组类型具有不完整的元素类型".我还尝试全局声明矩阵并给它一个指针.但它对我不起作用.帮助我解决这个问题,我们如何将矩阵传递给C中的函数.

c matrix

9
推荐指数
2
解决办法
2万
查看次数

复合/字符串文字在哪里存储在内存中?

我看了;

复合文字是C99功能,可用于创建没有名称的数组.考虑这个例子:

int *p = (int []){3, 0, 3, 4, 1};
Run Code Online (Sandbox Code Playgroud)

p指向包含3, 0, 3, 4和的五元素数组的第一个元素1.

其实我想知道,这个数组是否会存储在内存中,因为它没有名字?
换言之,如果是

char* str = "hello"
Run Code Online (Sandbox Code Playgroud)

字符串"hello"将存储在内存中?

c pointers compound-literals

8
推荐指数
2
解决办法
1080
查看次数

是a,&a,*a,a [0],&a [0]和&a [0] [0]相同的指针?

我有以下C程序:

#include <stdio.h>

int main(){
    int a[2][2] = {1, 2, 3, 4};
    printf("a:%p, &a:%p, *a:%p \n", a, &a, *a);
    printf("a[0]:%p, &a[0]:%p \n", a[0], &a[0]);
    printf("&a[0][0]:%p \n", &a[0][0]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给出了以下输出:

a:0028FEAC, &a:0028FEAC, *a:0028FEAC
a[0]:0028FEAC, &a[0]:0028FEAC
&a[0][0]:0028FEAC
Run Code Online (Sandbox Code Playgroud)

我无法理解为什么&a,a,*a-所有相同.同样的a[0],&a[0]&a[0][0].

编辑:

感谢答案,我已经理解为什么这些价值观会相等.Kernighan&Ritchie的书中的这一行被证明是我问题的关键:

 the name of an array is a synonym for the location of the initial element.
Run Code Online (Sandbox Code Playgroud)

所以,通过这个,我们得到了

a= &a[0],和

a[0]= &a[0][0] (考虑a作为数组的数组) …

c arrays pointers multidimensional-array

8
推荐指数
4
解决办法
9718
查看次数

程序不会停在scanf("%c",&ch)行上,为什么?

程序不会在scanf("%c",&ch)行停止.为什么它会发生sombody可以请向我解释这个

#include<stdlib.h>
#include<stdio.h>

struct list {
   char val;
   struct list * next;
};

typedef struct list item;

void main()
{
    char ch;
    int num;

    printf("Enter [1] if you want to use linked list or [2] for realloc\n");  
    scanf("%d", &num);
    if(num == 2)
    {
        scanf("%c", &ch); 
        printf("%c", ch);
    }
}
Run Code Online (Sandbox Code Playgroud)

c

8
推荐指数
2
解决办法
6856
查看次数

无序修改和访问指针

我收到了这个C表达式的警告:

*p0++ = mult(*p0, psign[i1]); 
Run Code Online (Sandbox Code Playgroud)

警告是:

unsequenced modification and access to 'p0' [-Wunsequenced]
Run Code Online (Sandbox Code Playgroud)

我认为表达式应该修改为:

*p0 = mult(*p0, psign[i1]);
p0++;
Run Code Online (Sandbox Code Playgroud)

行为(修改后)是否符合预期?我认为指针增量应该在p0指向的值更新后发生.

c prefix-operator

8
推荐指数
1
解决办法
4904
查看次数

如何在c中检查该行为是否未定义?

我知道以下是未定义的,因为我试图在同一个表达式中读取和写入变量的值,即

int a=5;
a=a++;
Run Code Online (Sandbox Code Playgroud)

但如果是这样,那么为什么以下代码片段未定义

int a=5;
a=a+1;
Run Code Online (Sandbox Code Playgroud)

在这里我也试图修改它的值a并同时写入它.

还解释了为什么标准没有解决这个问题或者删除这个未定义的行为,尽管事实上他们知道它是未定义的?

c undefined-behavior sequence-points

7
推荐指数
3
解决办法
744
查看次数

为什么使用数组索引循环数组比指针访问慢?

我正在阅读Kochan的书"C编程".在p.中的Pointer和Arrays部分中.264他说:

通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行.实际上,这是使用指针访问数组元素的主要原因之一 - 生成的代码通常更有效.当然,如果对数组的访问通常不是顺序的,那么只要涉及这个问题,指针就什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长.

有人可以解释什么比什么更快?具体来说,如果array [j]的速度=*(指针+ j)的速度那么索引数组的过程是什么,以及访问指针内容的过程是什么?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别.

总结:请给我一个Kochan所说的非常简单的例子.2个代码并指向更快的代码,不必解释为什么它是真的.

c arrays pointers

7
推荐指数
1
解决办法
1719
查看次数

如何破译C中的复杂指针声明?

所以我想举个例子:

int *pi; // pi is a pointer that points to an integer
const int *cpi; // cpi is a pointer that points to a constant integer
char *pc; // pc is a pointer to a char 
Run Code Online (Sandbox Code Playgroud)

我怎么读这些:

char **x; //x is a pointer to a char pointer?
char *y[];
char **z[];
Run Code Online (Sandbox Code Playgroud)

谢谢.

c pointers declaration

7
推荐指数
2
解决办法
2161
查看次数

#include在代码中间

我想在我的程序中有条件地包含头文件.是否可能,如果可以,我该怎么做?

我的想法是做这样的事情:

switch(opt)
{
case 0:
    {
        #include "matrix.h"
        break;
    }
case 1:
    {
        #include "grid.h"
        break;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是VS在我写这篇文章时的表现.这样对吗?

c header

6
推荐指数
1
解决办法
913
查看次数