据我所知,逻辑运算符的&&优先级高于||.在运行代码时:
#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.然后评估其正确的表达式(如果需要)
我错了吗?
我一直在尝试编写一个函数,它给出了元素为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中的函数.
我看了;
复合文字是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程序:
#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作为数组的数组) …
程序不会在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表达式的警告:
*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指向的值更新后发生.
我知道以下是未定义的,因为我试图在同一个表达式中读取和写入变量的值,即
int a=5;
a=a++;
Run Code Online (Sandbox Code Playgroud)
但如果是这样,那么为什么以下代码片段未定义
int a=5;
a=a+1;
Run Code Online (Sandbox Code Playgroud)
在这里我也试图修改它的值a并同时写入它.
还解释了为什么标准没有解决这个问题或者删除这个未定义的行为,尽管事实上他们知道它是未定义的?
我正在阅读Kochan的书"C编程".在p.中的Pointer和Arrays部分中.264他说:
通常,索引数组的过程比访问指针内容的过程花费更多的时间来执行.实际上,这是使用指针访问数组元素的主要原因之一 - 生成的代码通常更有效.当然,如果对数组的访问通常不是顺序的,那么只要涉及这个问题,指针就什么都不做,因为表达式*(指针+ j)和表达式数组[j]的执行时间一样长.
有人可以解释什么比什么更快?具体来说,如果array [j]的速度=*(指针+ j)的速度那么索引数组的过程是什么,以及访问指针内容的过程是什么?此外,有关SO的问题和答案提到在编译期间将数组[j]转换为*(数组+ j),因此不应有任何区别.
总结:请给我一个Kochan所说的非常简单的例子.2个代码并指向更快的代码,不必解释为什么它是真的.
所以我想举个例子:
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)
谢谢.
我想在我的程序中有条件地包含头文件.是否可能,如果可以,我该怎么做?
我的想法是做这样的事情:
switch(opt)
{
case 0:
{
#include "matrix.h"
break;
}
case 1:
{
#include "grid.h"
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这就是VS在我写这篇文章时的表现.这样对吗?