C 预处理器是否删除“&*”的实例?

2023-12-29

我正在玩gcc并尝试了以下代码:

int A = 42;
int *B = &A;
int *C = &*B;

And C == &A,正如预期的那样。但是当我尝试时:

int *B = NULL;
int *C = &*B;

事实证明C == NULL,并且没有段错误。所以&*B实际上并没有解除引用B在获取其地址之前。

我的猜测是预处理器正在剥离实例&* and *&在他们到达编译器之前,因为他们互相否定,但我找不到任何文档来验证这是否是标准的C或编译器特定的。

预处理器是否剥离&* and *&,我可以期待任何给定编译器的这种行为吗?


这并没有被预处理器剥离,&*最终等同于指针本身,我们可以通过以下方式看到这一点C99标准草案 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf 6.5.3.2 地址和间接运算符段落4其中说:

The unary * operator denotes indirection. If the operand points to a function, the result is a function designator; if it points to an object, the result is an lvalue designating the object. If the operand has type ‘‘pointer to type’’, the result has type ‘‘type’’. If an invalid value has been assigned to the pointer, the behavior of the unary * operator is undefined.87)

脚注 87 说:

因此,&*E 等价于 E(即使 E 是空指针),[...]

和段落3 says (强调我的):

一元 & 运算符产生其操作数的地址。如果操作数的类型为“type”, 结果的类型为“指向类型的指针”。如果操作数是一元 * 运算符的结果, 该运算符和 & 运算符都不会被求值,结果就像两者都被计算一样 省略,除了对运算符的约束仍然适用并且结果不是左值。

Update

可能值得注意的是,对于gcc and clang您可以使用以下命令查看预处理结果-E flag(现场观看 http://coliru.stacked-crooked.com/a/14c59c3b82357c73)以及在 Visual Studio 中/EP https://stackoverflow.com/questions/277258/c-c-source-file-after-preprocessing(现场观看 http://rextester.com/MYBJJ6088).

另外,值得注意的是,正如 MSalters 在他的评论中所说,只有两个令牌&*不足以理解上下文,如他的示例所示:

int *p, *q ;
int foo = *p & *q ;

所以只需删除&*在预处理阶段甚至不可能,因为您没有足够的信息来确定是否&地址运算符或按位和操作员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 预处理器是否删除“&*”的实例? 的相关文章

  • 使用 TCP 套接字在本地代理视频

    我一直对向媒体浏览器添加对视频播客的支持非常感兴趣 我希望用户能够浏览可用的视频播客并从互联网上流式传输它们 这真的很容易 因为媒体播放器等将愉快地播放存在于云中的文件 问题是我想在本地缓存这些文件 因此同一集的后续观看将不涉及流式传输 而
  • 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入

    我有时用Caliburn Micro http caliburnmicro com创建应用程序 使用最简单的 BootStrapper 我可以像这样使用 IoC 容器 SimpleContainer private SimpleContai
  • C - 计算文件中的单词、字符和行数。字符数

    我必须用 C 编写一段代码 输出给定文件中的字符数 行数和单词数 任务看起来很简单 但我现在真的不确定出了什么问题 所以 这是代码 include
  • 线程独占数据:如何存储和访问?

    NET 中是否有可能将对象实例绑定到线程的当前执行上下文 这样在代码的任何部分我都可以做类似的事情CurrentThread MyObjectData DoOperation 并确保我访问特定于线程的数据 谢谢 你可以看一下线程静态属性 h
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • Monitor.Pulse & Wait - 意外行为

    http www codeproject com Articles 28785 Thread synchronization Wait and Pulse demystified http www codeproject com Artic
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C++ 并行任务的开销

    我有以下简单的功能 include
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 微软怎么能说WinAPI中一个字的大小是16位呢?

    我刚刚开始学习WinAPI 在MSDN中 对WORD数据类型提供了以下解释 WORD16 位无符号整数 范围是十进制 0 到 65535 该类型在 WinDef h 中声明如下 typedef 无符号短 WORD 很简单 而且它与我一直在使
  • Cookie 在 ASP.net 中失去价值

    我有以下设置 cookie 的代码 string locale DropDownList this LoginUser FindControl locale SelectedValue HttpCookie cookie new HttpC
  • 使用左连接获得不适当的输出

    我正在尝试获取变体列表 并且对于每个变体都获取所有subvariants list无论子变体属于何处 特别的Test say 100 这是示例数据 Id TestId SourceSubVariantId TargetSubVariantI
  • 如何解析多态 JSON 数组?

    我有一个 JSON 格式的文件 其中包含个人用户的记录 一些用户的记录中间有一个评论字段 我只想解析顶级项目 全名 贡献者姓名 电子邮件 使用 Newtonsoft JSON 解析器 但我似乎无法让它识别单个对象 当我将整个字符串解析为一个
  • 如何在 C 语言中获取输入中的空格

    我想从控制台获取字符数组 它还包含空格 我在 C 中知道的唯一方法是 scanf 但是一旦遇到空格 它就会停止接受输入 我该做什么 这就是我正在做的事情 char address 100 scanf s address 尝试使用 fgets
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • NSubstitute - 测试特定的 linq 表达式

    我在当前正在开发的 MVC 3 应用程序中使用存储库模式 我的存储库界面如下所示 public interface IRepository
  • 推断“x => { throw .. }”的 Lambda 与重载方法中的 Func 匹配吗?

    我不明白为什么 C 最终在以下 LINQPad 代码中执行不正确的扩展方法 void Main Actual Sync Action Expected Sync Action Run x gt x Dump Actual Async Tas
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • 网络状态改变时广播Intent

    当网络状态发生变化 即从 GSM 到 Wifi 时 Android 是否会广播意图 如果是这样 我需要什么许可以及意图操作是什么 Update 请改用这个 https stackoverflow com a 2677519 241869 h
  • 如何通过浏览器javascript访问Docusign API?

    我正在用 Javascript 构建一个基于浏览器的应用程序 我尝试通过 jQuery 访问 docusign api support cors true ajax crossDomain true url https demo docus
  • 找出多态对象的大小

    我有一个指针Base base ptr到多态对象 是否可以找出所述对象的动态类型的大小 AFAIK sizeof base ptr 产生静态类型的大小base ptr 我开始怀疑这是不可能的 但也许我忽略了一些事情 注意 我知道我可以向类型
  • Heroku - 未找到视图 - FileFinderView InvalidArgumentException

    这消耗了我生命的最后两天 本地一切工作正常 但是当我的代码部署到 Heroku 时 Laravel 找不到index看法 据我了解 这是一些缓存问题 因此我尝试了 Artisan 的大部分命令来清理缓存 php artisan config
  • 基于单选的AngularJS Filter

    我正在实现一个搜索输入框 该输入框应该基于正在迭代的对象的特定属性进行搜索 并且我希望使用单选按钮来选择它们 例如 这是我的代码 span style margin bottom 10px display inline block Sear
  • 从 4 个整数的列表生成最大 HH:MM [重复]

    这个问题在这里已经有答案了 注意 另一个问题是这个问题的重复 如果我这个问题比那个问题早 6 个月发布 那么我的问题怎么会是重复的呢 我有 4 个非负整数 a b c d 它们都小于或等于 9 我必须以 24 小时格式返回时钟上可以显示的最
  • 如何构建访问控制列表 (ACL) 的数据模型

    当您只处理对离散资源具有一定访问级别的离散用户时 如何对充当访问控制列表 ACL 的数据库表进行建模是相当明显的 像这样的事情 TABLE acl user id INT resource id INT access type INT 其中
  • jenkins python 模块导入错误

    我已经在虚拟机中安装了 jenkins 模块 但仍然无法导入该模块并使用 Python 2 7 5 默认 2014 年 6 月 17 日 18 11 42 GCC 4 8 2 20140120 红帽 4 8 2 16 在 linux2 上
  • 如何避免 R 中的双重“for”循环

    我必须对数据框 ddf 的所有列组合执行函数 我通常这样做 myfunction lt function col1 col2 print aov col1 col2 ddf data frame first 1 3 second lette
  • 将 Django TimeField 中的时间乘以 float

    我正在尝试将当前表示为字符串的时间读取到 Python 2 7 中的 Django TimeField 模型中 并同时通过浮点数对其进行缩放 例如 00 31 14 1 0617 00 29 20 我已成功读取时间并将其存储到模型中 但无法
  • 类循环引用的原因?

    我知道循环引用 A 类持有 B 类 B 类持有 A 类 但由于我的编程还不够 我很难找到使用它们的理由 我想知道人们是否可以给我一些例子并解释使用它们的充分理由 就我而言 现在我正在查看 2D 源代码教程 用户创建了一个相互引用的 Crea
  • ggplot 相当于 matplot

    ggplot2 中是否有等效的函数来绘制该数据集 我使用 matplot 并读到可以使用 qplot 但它确实不起作用 ggplot matplot https stackoverflow com questions 12047787 gg
  • 是否应该使用实体类作为请求主体[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 假设我必须保存一个实体 在本例中为 Book 我有下一个代码 RestController RequestMapping books publi
  • 有没有办法在纯函数中放置一些不纯的代码?

    IO 就像Maybe 只是一个例子Monad 另一方面 我们有所有的数据构造函数Maybe Just and Nothing 但没有构造函数IO Reader and Writer也不要导出构造函数 它们具有返回此类型实例的函数 reade
  • NodeJS + Express:如何保护 URL

    我正在使用最新版本的 NodeJS 和 ExpressJS 用于 MVC 我通常这样配置我的休息路径 例如 app get archive routes archive 现在我想要我的 admin 要保护的 URL 集 我的意思是我只需要简
  • isset 和 !empty 未通过对上传文件的检查

    我有一个上传表单 其中包含要上传的文件 我遇到的问题是 即使没有上传文件 if isset FILES OR if empty FILES 仍然成功通过 FILES HTTP POST FILES if POST type photo is
  • 刷新页面后如何保持单个复选框保持选中状态?

    HTML 代码 div class wrap h3 Background Swap h3 div
  • 找不到第三方模块的声明文件 - 如何声明和解决这些错误

    我正在开发一个使用 typescript 的项目 使用 vue cli 3 0 生成 当我导入第三方模块时 出现如下错误 Could not find a declaration file for module vue slider com
  • UIVisualEffectView 在不同设备上呈现不同的效果

    In my ViewController swift var img UIImageView image UIImage named puddles img frame view bounds view addSubview img var
  • C 预处理器是否删除“&*”的实例?

    我正在玩gcc并尝试了以下代码 int A 42 int B A int C B And C A 正如预期的那样 但是当我尝试时 int B NULL int C B 事实证明C NULL 并且没有段错误 所以 B实际上并没有解除引用B在获