小编Jin*_*Jin的帖子

为什么在C中不允许这个指针算术?

char arr[] = "Hello";
arr = arr + 1;  // error occurs
Run Code Online (Sandbox Code Playgroud)

据我所知,具有数组类型的表达式将转换为指向数组初始元素的指针类型.因此,我期望arr = arr + 1(指向数组的第一个元素(arr)的指针成为指向数组的第二个元素的指针).为什么这不适用于C?

c arrays pointers

39
推荐指数
4
解决办法
4083
查看次数

在C中评估赋值运算符的左操作数有什么意义?

根据ISO C11 - 6.5.16.3,它说

  1. 赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.

所以我想这意味着,例如,

int x = 10;
x = 5 + 10;
Run Code Online (Sandbox Code Playgroud)
  1. 左操作数x计算为10,右操作数计算为15.
  2. 右操作数值存储在左操作数指定的对象中x.

但是如果赋值的目的是存储右操作数的evalauted值(就像在step2中那样),为什么左操作数的评估是必要的?评估左操作数有什么意义?

c evaluation assignment-operator

17
推荐指数
2
解决办法
1171
查看次数

C中命令行参数`argv`的类型是什么?

我正在阅读C Primer Plus中关于命令行参数的一节argv,我很难理解这句话.

它说,

程序将命令行字符串存储在内存中,并将每个字符串的地址存储在指针数组中.该数组的地址存储在第二个参数中.按照惯例,argv对于参数值,将调用指向指针的指针.

这是否意味着命令行字符串作为指向数组的指针数组存储在内存中char

c arrays pointers argv language-lawyer

14
推荐指数
3
解决办法
7859
查看次数

执行和评估之间有什么区别?

我们说表达"评估"值和语句命令计算机"执行".但对我来说,似乎是相同的术语.C中的执行和评估有什么区别?

c evaluation execution

11
推荐指数
3
解决办法
1978
查看次数

关于C中的解引用运算符("*")的混淆

据我所知,derefence运算符*返回存储在指针地址中的值.我感到困惑的是当操作符与数组的指针一起使用时的行为.例如,

int a[4][2];
Run Code Online (Sandbox Code Playgroud)

然后a在内部转换为2个整数的4个元素的数组的第一个元素的指针.然后*a返回哪个值?我真的很困惑!

c arrays dereference

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

关于C中sizeof运算符的困惑

我对sizeofC中的运算符感到困惑.

#include <stdio.h>

int main(void)
{
    char num1=1, num2=2, result;
    result = num1 + num2;
    printf("Size of result: %d \n",sizeof result);
    printf("Size of result: %d \n",sizeof(num1+num2));
}
Run Code Online (Sandbox Code Playgroud)

结果分别为1和4.为什么会这样?

c sizeof addition integer-promotion

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

什么是C中对象类型的指针?

例如,

int x = 10;
Run Code Online (Sandbox Code Playgroud)

然后将值10保存在内存中的某个位置.我听说过"指向int对象的指针",但我从未听说过"指向对象类型的指针".这是否意味着10存储的对象保存有关存储在对象中的值类型的信息,"指向对象类型的指针"的值显示此信息存储在内存中的位置?

c pointers object

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

数组名称不是左值的原因是什么?

例如,

int x[10];
int i = 0;
x = &i; //error occurs!
Run Code Online (Sandbox Code Playgroud)

根据C - A参考手册,数组名称不能是左值.因此,x不能是左值.但是,数组名称不能是左值的原因是什么?例如,为什么第三行发生错误?

c arrays lvalue

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

操作系统如何识别文本文件的结尾?

例如,有一个名为"Hello.txt"的文本文件

Hello World!

然后操作系统(我使用MS-DOS)如何识别此文本文件的结尾?在'!'之后隐藏某种字符或符号 哪个表示文件结束?

c operating-system eof

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

'流'在C中意味着什么?

我正在阅读"C Primer Plus"中的一个部分,它处理文件,流和键盘输入.作者将流的概念与文件连接起来,并按如下方式定义流:

从概念上讲,C程序处理流而不是直接处理文件.流是实际输入或输出映射到的理想化数据流.这意味着具有不同属性的各种输入由具有更均匀属性的流表示.然后打开文件的过程变为将流与文件相关联,并且通过流进行读取和写入

作者用粗体句来表示什么?文件和流之间的联系是什么?

c terminology file stream

5
推荐指数
3
解决办法
3870
查看次数

Python中的zip对象不是迭代器吗?

我正在阅读Bill Lubanovic的“ Python简介”,它说

像zip()一样,range()返回一个可迭代的对象,

但这不是不正确的说法吗?例如,

s= zip([1,2,3],['one','two','three'])
next(s)
>> (1,'one')
next(s)
>> (2,'two')

a = range(10)
next(a)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-54-7b3ad3809256> in <module>()
      1 a = range(10)
----> 2 next(a)

TypeError: 'range' object is not an iterator
Run Code Online (Sandbox Code Playgroud)

从上面的代码中,我们可以检查zip()返回的是迭代器而不是可迭代的对象。

python iterator iterable

2
推荐指数
1
解决办法
700
查看次数

关于C中的转换说明符

我对C中的转换说明符有疑问.

在第5句中,如果我使用%lf%Lf代替%f,则不会发生错误.但是,如果我使用,为什么会发生错误%f

#include <stdio.h>

int main(void)
{
    long double num;
    printf("value: ");
    scanf("%f",&num);  // If I use %lf or %Lf instead of %f, no error occurs. 
    printf("value: %f \n",num);
}
Run Code Online (Sandbox Code Playgroud)

c format-specifiers

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

为什么*(&identifier)= value在C中有效?

例如,

int x = 10;
*(&x) = 20;
printf("%d \n",x); // output is 20
Run Code Online (Sandbox Code Playgroud)

根据ISO C11-6.5.3.2第4段,它说

一元*运算符表示间接.如果操作数指向函数,则结果是函数指示符; 如果它指向一个对象,则结果是指定该对象的左值.如果操作数的类型为''指向类型'',则结果的类型为''type''.如果为指针分配了无效值,则unary*运算符的行为未定义.

由于操作数&x既不是函数指示符也不是对象指示符(它是指向int类型的指针),我期望未定义的行为,但它工作正常!我错过了什么?

c dereference

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